如何解决如何将给定的列表列表转换为 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 举报,一经查实,本站将立刻删除。