Как «обрезать» любое дерево от нежелательных узлов? - PullRequest
0 голосов
/ 29 марта 2020

У меня есть обобщенное c anytree, например, это:

Node('/root')
├── Node('/root/branch_1')
└── Node('/root/branch_2')
    ├── Node('/root/branch_2/subbranch_21')
    └── Node('/root/branch_2/subbranch_22')
        ├── Node('/root/branch_2/subbranch_22/leaf_221')
        └── Node('/root/branch_2/subbranch_22/leaf_222')

Для упрощения, давайте предположим для моего вопроса, что имена узлов также являются именами переменных для этих узлов, поэтому Я визуально не загружаю сообщение с избыточными объявлениями.

Я бы хотел, чтобы моя функция обрезала это любое дерево на некоторых его ветвях, листьях и, возможно, на root после списка сохраняемых узлов. Например, если моя функция получает [branch_2, subbranch_21, leaf_221], она должна вернуть любое дерево, содержащее эти Узлы, как новые root и удалить обрезанные Узлы, которые не были переданы, но все еще с необходимыми ветвями, которые, возможно, не были заданы, поэтому я должен have:

Node('/root/branch_2')
├── Node('/root/branch_2/subbranch_21')
└── Node('/root/branch_2/subbranch_22')
    └── Node('/root/branch_2/subbranch_22/leaf_221')

Node subbranch_22 не было в списке, но он находится на необходимом пути от branch_2 к leaf_221, которые были.

Из документов anytree я только нахожу довольно laconi c Подсказка по обрезке деревьев, которая устанавливает для родителя или детей ветви значение None, но я изо всех сил пытаюсь придумать что-нибудь элегантное или даже слегка надежное, чтобы обрезать дерево.

У вас есть какой-нибудь совет?

...