Генерация идентификатора для каждого узла в дереве - PullRequest
0 голосов
/ 30 января 2020

Я построил дерево с помощью модуля anytree в python. Код выглядит следующим образом:

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

Как назначить идентификатор для каждого узла в дереве?

1 Ответ

0 голосов
/ 30 января 2020

Результирующее дерево:

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

Экземпляры объекта узла как-то уже сами по себе являются идентификатором. Вы можете назначить новые атрибуты для объектов в любое время. Например, когда вы перебираете дерево

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
...