Я пытаюсь создать функцию в Python, которая берет произвольный узел дерева и заполняет список списков, основанный на заданном узле.
Учитывая следующее плохо нарисованное дерево:
Если мы начнем, например, с узла 5, мы должны получить:
И узлы должны заканчиваться списком списков, по одному списку для каждой глубины.
Узлы в python:
nodes = [
{'id': 1, 'parent': None},
{'id': 2, 'parent': 1},
{'id': 3, 'parent': 1},
{'id': 4, 'parent': 2},
{'id': 5, 'parent': 2},
{'id': 6, 'parent': 5},
{'id': 7, 'parent': 6},
{'id': 8, 'parent': 3}
]
Мы можем видеть только родителей, а не детей, но это тот формат данных, с которым мне приходится работать, к сожалению.
Итак, если мы возьмем узел 5, мы хотим в итоге список узлов выглядит примерно так:
nl = [
[{'id': 6, 'parent': 5}],
[{'id': 4, 'parent': 2}, {'id': 5, 'parent': 2}],
[{'id': 2, 'parent': 1}, {'id': 3, 'parent': 1}],
]
Это код, который у меня есть до сих пор. Я считаю, что рекурсивная функция, вероятно, самый простой способ. К сожалению, похоже, что она ничего не делает думаю, что так и должно быть, и, очевидно, я делаю что-то очень неправильное. И этот код даже не рассматривает получение дочерних узлов, с которыми я не совсем уверен, как вообще иметь дело, кроме возможной передачи потом, что было бы много EAS
node_list = []
def pop_list(nodes=None, parent=None, node_list=None):
if parent is None:
return node_list
node_list.append([])
for node in nodes:
if node['parent'] == parent:
node_list[-1].append(node)
if node['id'] == parent:
parent = node['parent']
return pop_list(nodes, parent, node_list)
print pop_list(nodes, 5, node_list)
Вот вывод:
[[], [{'id': 3, 'parent': 1}], []]
Не совсем уверен, где я иду не так.