在不使用类/对象

时间:2017-03-03 20:59:34

标签: python python-3.x recursion tree hierarchy

我在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结构的样子?

1 个答案:

答案 0 :(得分:2)

您可以简单地遍历每个childparent元组,创建将孩子的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