我在Python 3中创建树层次结构时遇到了问题。我希望能够在不使用类的情况下执行此操作。
我需要开始的数据不是有序的,格式为['ID','Parent']
:
data=[['E1', 'C1'],['C1', 'P1'],['P1', 'R1'],['E2', 'C2'],['C2', 'P2'],['P2', 'R1'],['C3', 'P2'],['E3', 'C4'],['C4', 'P3'],
['P3', 'R2'],['C5', 'P3'],['E4', 'C6'],['C6', 'P4'], ['P4', 'R2'],['E5', 'C7'],['C7', 'P5'],['P5', 'R3'],['E6', 'C9'],['C9', 'P6'],['P6', 'R3'],
['C8', 'P6'],['E7', 'C10'],['C10', 'P7'],['P7', 'R4'],['C11', 'P7'],['E8', 'C12'],['C12', 'P8'],['P8', 'R4']]
我想在不使用类的情况下创建(树)字典变量,最终得到如下内容:
Tree={'R1':{'P1':{},'P2':{}},'R2':{}} etc
OR
Tree={'R1':[{'P1':[],'P2':[]}],'R2':[]} etc
显然,R1和R2有更多的孩子,但也许这就是Tree结构的样子?
答案 0 :(得分:2)
您可以简单地遍历每个child
,parent
元组,创建将孩子的id和父级的id映射到包含这些元素子级的列表的字典。我们一直这样做,直到我们完成。
roots = set()
mapping = {}
for child,parent in data:
childitem = mapping.get(child,None)
if childitem is None:
childitem = {}
mapping[child] = childitem
else:
roots.discard(child)
parentitem = mapping.get(parent,None)
if parentitem is None:
mapping[parent] = {child:childitem}
roots.add(parent)
else:
parentitem[child] = childitem
既然我们已经这样做了,roots
是树根的一组id:所以对于每个这样的元素,我们知道没有id是父类。对于roots
中的每个ID,我们只需从mapping
中获取,这是结构{'childid':child}
的字典,其中childid
是id(此处为{{1} }})和string
再次是该表单的字典。
所以你可以打印它们:
child
所以在你的情况下,for root in roots:
print(mapping[root])
是:
tree
对于您的样本tree = { id : mapping[id] for id in roots }
,它会生成:
data