Доступ к конкретным детям на любом дереве - PullRequest
0 голосов
/ 27 июня 2018

Я начал использовать anytree, но в настоящее время сталкиваюсь с некоторой проблемой, повторяющейся в моем дереве.

Тестовое дерево:

top = Node("top", keywords="topleveltree")
hello = Node("hello", keywords="hello", parent=top)
hello1 = Node("hello X", keywords="hello X", answer="Say hello to X", parent=hello)
hello2 = Node("hello Y", keywords="hello Y", answer="Say hello to Y", parent=hello)
goodbye = Node("goodbye", keywords="goodbye", parent=top)
goodbye1 = Node("goodbye X", keywords="goodbye X", answer="Say goodbye to X", parent=goodbye)

RenderTree:

Node('/top', keywords='topleveltree') ├── Node('/top/hello', keywords='hello') │ ├── Node('/top/hello/hello X', answer='Say hello to X', keywords='hello X') │ └── Node('/top/hello/hello Y', answer='Say hello to Y', keywords='hello Y') └── Node('/top/goodbye', keywords='goodbye') └── Node('/top/goodbye/goodbye X', answer='Say goodbye to X', keywords='goodbye X')

Мой скрипт извлекает первый уровень моего дерева (/ top / hello и / top / goodbye), и теперь я в основном пытаюсь получить то, что находится под ними (особенно ключевые слова и ответ).

Мне удалось добиться этого, используя несколько способов, таких как hello.descendants или просто используя LevelOrderIter(hello), однако сейчас я пытаюсь сделать то же самое с помощью некоторой логики Python (где переменная теперь является строкой) .

Я пытался запустить Node (привет) .descendants, но он возвращает пустой массив. Однако, если я запускаю type(hello) и type(Node('hello')), оба возвращают <class 'anytree.node.node.Node'>

например:

categories = ['hello','goodbye']
for category in categories:
    print category # string
    print Node(category) # Node('/hello')
    print hello # Node('/top/hello', keywords='hello')
    hello.descendants # ok
    Node(category).descendants # ()

[node.name for node in PreOrderIter(hello, maxlevel=3)] # ok
[node.name for node in PreOrderIter(Node('hello'), maxlevel=3)] # return empty 

У меня очень мало опыта работы с деревом, поэтому я думаю, что упускаю что-то простое, но не могу найти что.

1 Ответ

0 голосов
/ 03 марта 2019

Для доступа к древовидной структуре мы можем использовать индекс. Как parent.children [1] .name это даст мне данные дочернего элемента 1 в дереве. см. код ниже

по этому коду я просто создаю детей:

Start_point={
            "man":False,
           "goat":False,
           "lion":False,
           "grass":False,
            "state":True
          }
udo = Node(Start_point)


# East conditions
temp=dict(udo.name)
for i in temp:
    if(temp["state"]==True):
        temp=dict(udo.name)
        if (i=="man" and temp["man"]==False):
            left=dict(temp)
            left["man"]=True
            Node(left,parent=udo)

        if (temp["man"]==False):
            temp["man"]=True
            if (i=="goat" and temp["goat"]==False):
                mid1=dict(temp)
                mid1["goat"]=True
                Node(mid1,parent=udo)
            elif (i=="lion" and temp["lion"]==False):
                mid2=dict(temp)
                mid2["lion"]=True
                Node(mid2,parent=udo)
            elif (i=="grass" and temp["grass"]==False):
                right=dict(temp)
                right["grass"]=True
                Node(right,parent=udo)


for pre, fill, node in RenderTree(udo):
       print("%s%s" % (pre, node.name))   

результат этого:

{'man': False, 'goat': False, 'lion': False, 'grass': False, 'state': True}
├── {'man': True, 'goat': False, 'lion': False, 'grass': False, 'state': True}
├── {'man': True, 'goat': True, 'lion': False, 'grass': False, 'state': True}
├── {'man': True, 'goat': False, 'lion': True, 'grass': False, 'state': True}
└── {'man': True, 'goat': False, 'lion': False, 'grass': True, 'state': True}

Основной код для доступа ребенка:

udo.children[1].name

Результат:

{'man': True, 'goat': True, 'lion': False, 'grass': False, 'state': True}

по этому я получил данные child[1]

и, изменяя индекс, я могу получить конкретного ребенка.

...