2013-04-25 88 views
2

使用Python,我有一个包含彼此之间父/子关系的字典对象列表,我想将它们构建到树中。例如:在Python中使用父/子列表构建树

{'UI': 'T071', 'NAME': 'Entity', 'PARENT': None, 'CHILDREN': 'Conceptual Entity'} 
{'UI': 'T077', 'NAME': 'Conceptual Entity', 'PARENT': 'Entitity', 'CHILDREN': 'Organism Attribute, Finding, Idea or Concept'} 
{'UI': 'T032', 'NAME': 'Organism Attribute', 'PARENT': 'Conceptual Entity', 'CHILDREN': 'Clinical Attribute'} 
etc. 

共有数据集中4个节点(具有设置为无“父”),这使得4种独立的树木。所以,我打算制作一份树木清单。

数据不一定是任何种类的排序(因此层次结构中较高的节点不一定在列表中较高)。此外,id(UI)没有特定的顺序(树中的T071不一定比T072高)。它们的名称是唯一的,数据集使用它们的名称而不是id(UI)来显示关系。

我有这个简单的类:

class node(): 
    def __init__(self, value): 
     self.value = value 
     self.children = [] 

    def add_child(self, obj): 
     self.children.append(obj) 

我有点难倒如何处理这个。建议非常感谢。

+0

XD没有双关语意思?顺便提一下,'dictts'的'dict'是存储图形信息的一种非常自然的方式。无需创建单独的节点对象来存放您的数据。 – 2013-04-25 02:23:05

回答

2

我认为最好是做两遍。首先,创建一个将名称链接到节点的字典。然后你可以有效地添加你的物品。

我的代码:

nodes = dict((e["NAME"], node(e)) for e in l) 
for e in l: 
    if e["PARENT"] is not None: 
     nodes[e["PARENT"]].add_children(nodes[e["NAME"]) 

如果你想要的根源,你可以,如果上面使用,或者可以过滤节点。

roots = [n for n in nodes.values() if d.value["PARENT"] is None] 
1

我曾经代表只有一个字典一个*九进程树,并为每个父PID子进程PID的列表。所以,你得到:

dict_[1] = [2, 3, 4] 
dict_[2] = [5, 100] 
dict_[3] = [6, 200] 
dict_[4] = [7, 300] 
dict_[6] = [400] 

它似乎工作得很好。

无论您是希望叶节点是否存在空列表或是不出现在树中,都是可选的。我已经将它们显示在字典级别的树中。

我相信这只适用于pid(节点)只能出现在树中的一个地方。 EG,100不能是2的子女 4.