Как читать словарь дерева - PullRequest
1 голос
/ 18 июня 2019

Предположим, мы имеем следующую древовидную структуру:

a = [(1, 2), (2, 2), (3, 2), (4, 2), (5, 4), (6, 5), (7, 8), (8, 11), (9, 10), (10, 11), (11, 11)]

поэтому мы получаем с этим кодом Python - генерируем словарь (дерево) из списка кортежей структура

[{'id': 2, 'Children': [{'id': 1}, {'id': 3}, {'id': 4, 'Children': [{'id': 5, 'Children': [{'id': 6}]}]}]}, {'id': 11, 'Children': [{'id': 8, 'Children': [{'id': 7}]}, {'id': 10, 'Children': [{'id': 9}]}]}]

мой вопрос: как я могу взять всех детей из специального узла этого словаря? например: все дети 11 лет: (7, 8, 9, 10) что делать?

1 Ответ

0 голосов
/ 18 июня 2019

Вы можете использовать рекурсию с генератором, чтобы найти нужных потомков узла.Во-первых, для упрощения поиска позже, используйте рекурсию для реструктуризации дерева:

data = [{'id': 2, 'Children': [{'id': 1}, {'id': 3}, {'id': 4, 'Children': [{'id': 5, 'Children': [{'id': 6}]}]}]}, {'id': 11, 'Children': [{'id': 8, 'Children': [{'id': 7}]}, {'id': 10, 'Children': [{'id': 9}]}]}]
def rebuild(d):
  return {i['id']:None if 'Children' not in i else rebuild(i['Children']) for i in d}

result = rebuild(data)

Теперь примените функцию рекурсивного генератора:

def get_children(d):
  for a, b in d.items():
    yield a
    if isinstance(b, dict):
       yield from get_children(b)

print(sorted(get_children(result[11])))

Вывод:

[7, 8, 9, 10]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...