繁体   English   中英

从 Python 中的父/子列表构建树

[英]Build tree out of list of parent/children in 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 个根节点('PARENT' 设置为 None),它们构成了 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)

我对如何解决这个问题有点困惑。 非常感谢建议。

我觉得最好是做两次pass。 首先,您创建一个将名称链接到节点的字典。 然后,您可以有效地添加您的项目。

我的代码:

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"])

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

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

我曾经用一个 dict 表示一个 *ix 进程树,以及每个父 pid 的子进程 pid 列表。 所以你得到:

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

它似乎工作得很好。

您是否希望叶节点与空列表一起存在,或者只是不出现在树中,这是可选的。 我已经在上面显示它们没有出现在字典级别的树中。

我相信这仅适用于 pid(节点)只能出现在树中的一个位置的情况。 例如,100 不能是 24 的孩子。

代码深入字典树多达 5 层。 当到达某个对象时,它会检查它是否是 numpy。 如果是,则打印其形状。 如果不是,则写入对象的类型。 通过选择“级别”,它可以确定树应该走多深。 当前的实现达到了 5 个级别的深度。

def tree_view_dict(d, level=999):
    for key in d.keys():
        print('|')
        print(key, end = '')
        if isinstance(d[key], dict) and level > 1:
            print()
            for key2 in d[key].keys():
                print('|__', key2, end = '')
                if isinstance(d[key][key2], dict) and level > 2:
                    print()
                    for key3 in d[key][key2]:
                        print('   |__', key3, end = '')
                        if isinstance(d[key][key2][key3], dict) and level > 3:
                            print()
                            for key4 in d[key][key2][key3]:
                                print('     |__', key4, end = '')
                                if isinstance(d[key][key2][key3][key4], dict) and level > 4:
                                    print()
                                    for key5 in d[key][key2][key3][key4]:
                                        print('       |__', key5, end = '')
                                else:
                                    print(': ', d[key][key2][key3][key4].shape if type(d[key][key2][key3][key4]).__module__ == 'numpy' else type(d[key][key2][key3][key4]))
                        else:
                            print(': ', d[key][key2][key3].shape if type(d[key][key2][key3]).__module__ == 'numpy' else type(d[key][key2][key3]))
                else:
                    print(': ', d[key][key2].shape if type(d[key][key2]).__module__ == 'numpy' else type(d[key][key2]))
        else:
            print(': ', d[key].shape if type(d[key]).__module__ == 'numpy' else type(d[key]))
    pass

d = {'UI': 'T032', 'NAME': 'Organism Attribute', 'PARENT': 'Conceptual Entity', 'CHILDREN': {'CHILDREN_array': np.array([[1,2], [3,4]]),'CHILDREN_name': 'name'}}
tree_view_dict(d, level=5)

结果与,


|
UI:  <class 'str'>
|
NAME:  <class 'str'>
|
PARENT:  <class 'str'>
|
CHILDREN
|__ CHILDREN_array:  (2, 2)
|__ CHILDREN_name:  <class 'str'>```

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM