Python で関数を作成しようとしています。これは、ツリーの任意のノードを取得し、ノードに基づいてリストのリストを作成します。
次の不適切に描画されたツリーがあるとします。
たとえば、ノード 5 から開始すると、次のようになります。
- 開始したノード (4 と 5) を含む、同じ親ノードを持つすべてのノードを含むリスト
- 子ノードはありますが、その子ノードは含まれません (6)。
- 親ノードと同じ親を持つすべての親ノード、およびそれらの親のノードなど、ルート ノードに到達するまで、ただしルート ノードは含まれません (この場合は 2 と 3 だけですが、ツリーがより深く、開始した場合)低く、ここにもっとあるでしょう。
ノードは、深さごとに 1 つのリストのリストのリストになるはずです。
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}],
]
これは私がこれまでに持っているコードです。再帰関数がおそらく最も簡単な方法だと思います。残念ながら、私がそうあるべきだと思うようなことは何もしていないようで、明らかに私は何か非常に間違ったことをしています。そして、このコードは、処理方法がまったくわからない子ノードを取得することさえ考慮していません。後で処理する方がはるかに簡単です。
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}], []]
ここでどこが間違っているのか正確にはわかりません。