为树中的每个节点生成 ID

Generate ID for each node in a tree

我使用 python 中的 anytree 模块构建了一棵树。 代码如下:

def list_anytree(lst):
    rootname = lst[0][0]
    node = Node(rootname)
    for j in lst:
        parentnode = node
        assert j[0] == parentnode.name
        for currentnodename in j[1:]:
            currentnode = next(
                (node for node in parentnode.children if node.name == currentnodename),
                None,
            )
            if currentnode is None:
                currentnode = Node((currentnodename), parent=parentnode)
            parentnode = currentnode
    return node

lst=[["a","b","c"],["a","b","d"],["a","b","c",]]

anytree=list_anytree(lst)
for pre,fill,node in RenderTree(anytree):
    print(f"{pre}{node.name}")

如何为树中的每个节点分配一个 ID?

生成的树是:

a
└── b
    ├── c
    └── d

节点对象实例本身已经是一个 id。 您可以随时为对象分配新属性。 例如,当您遍历树

for idx, node in enumerate(PreOrderIter(anytree)):
    node.idx = idx

或者您使用 python id() 函数,它给出一个唯一的数字。 请注意,此数字在每次调用时都会发生变化:

for pre, fill, node in RenderTree(anytree):
    id_ = id(node)
    print(f"{pre}{node.name} {node.idx} {id_:08X}")

结果

a 0 7FE95CDB1390
└── b 1 7FE95CDB1FD0
    ├── c 2 7FE95CDC4048
    └── d 3 7FE95CDC4080