如何将给定的列表列表转换为 Python 中的树结构?

如何解决如何将给定的列表列表转换为 Python 中的树结构?

所以我基本上被这个问题困住了。该问题为我们提供了一个零件清单列表,其中每个组件由其他组件组成(以树关系的方式)。例如输入列表可以给出为

[["A",[2,"B"],[1,"C"]],["B","D"],"E"]],["D",20.],["E",10.]
["C",40.]]

,其中 A 由 2 个 B 和 1 个 C 组成,类似地,B 由 1 个 D 和 1 个 E 组成。以浮点数作为最后一个索引的列表仅表示给定基本部分的单价。>

问题是,我需要将此结构转换为可以写成的树表示;

[1,"A","B","D","E",10.]],"C",40.]]

我们简单地将每个节点的子节点作为一个列表埋在嵌套列表结构中。为了实现这一点,我尝试了递归迭代算法,但由于我们不知道一个节点有多少个子节点或树的深度是多少,我无法这样做。

你能给我推荐一个解决这个问题的方法吗,提前致谢。

P.S:输入列表没有预定义的顺序,它的元素可以从树的底部到顶部放置或随机排列。

解决方法

如果您的输入结构保持不变,那么您可以尝试类似

col1   col2    col3    count   new_count
A       d       1        3       5
V       d       23       3       7
C       q       32       5       5
V       r       43       4       7
A       y        2       2       5

输出

e = [["A",[2,"B"],[1,"C"]],["B","D"],"E"]],["D",20.],["E",10.],["C",40.]]

record = {}

for i in reversed(e):
    if(len(i) == 2):
        record[i[0]] = i[1]
    else:
        # there is children
        temp = []
        for j in i[1:]:
            if(isinstance(record[j[1]],list)):
                temp.append([*j,*record[j[1]]])
            else:
                temp.append([*j,record[j[1]]])
        record[i[0]] = temp

root = e[0][0]
print([1,root,*record[root]])  

否则,您可以创建一个树结构并获取输出。

,

您可以利用列表是指针这一事实,通过复制父列表中的子列表引用来一次性执行链接:

def buildTree(data):
    index = { c[0]:c for c in data }  # used to access components by their id
    root  = index.copy()              # used to retain top level component(s)

    for component in data:
        if isinstance(component[1],float): continue   # no linking on leaf items
        for i,(_,prod) in enumerate(component[1:],1): # expand children
            component[i][1:] = index[prod]            # embed child in parent
            root.pop(prod)                            # remove child from root

    return [[1,*rv] for rv in root.values()] # output root item(s)

输出:

data = [["A",20.0],10.0],40.0]]

print(*buildTree(data))
# [1,'A','B','D','E',10.0]],'C',40.0]]

改变数据顺序不会改变结果

data = [["D",40.0],["A","C"]]]

print(*buildTree(data))
# [1,40.0]]

请注意,如果您的数据有多个根项,该函数会将它们全部输出。在这种情况下只有一个所以它只打印一个根

没有字典

如果您不被允许使用字典,您仍然可以使用这种方法,但您必须对数据进行顺序搜索才能按 id 查找产品:

def buildTree(data):
    roots  = data.copy() # used to retain top level component(s)
    for component in data:
        if isinstance(component[1],1): # expand children
            child = next(c for c in data if c[0]==prod) # find child with id
            component[i][1:] = child                  # embed child in parent
            roots.remove(child)                       # remove child from root
    return [[1,*rv] for rv in roots] # output root items

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?