![](/img/trans.png)
[英]Inheritance issue in python with a python tree library (anytree)
[英]Python JSON to tree with anytree
我有 JSON 數據,看起來像
{'Tree': [
{"From": "1",
"To": "2"},
{"From": "2",
"To": "3"}
]}
基本上是節點之間所有現有引用的數組。 我希望能夠使用此數據從選定的根節點開始繪制樹。
我發現使用 anytree 我必須將一個節點鏈接到父節點,但理想情況下我只想將它鏈接到名稱並讓它自己組合樹結構。
# I want to do this
child[0] = Node(data[0]["To"], parent=data[0]["From"])
# But I think I need to assign a node, not its name
child[1] = Node(data[1]["To"], parent=child[?])
關於如何做到這一點的建議?
分兩步執行此操作:
將輸入格式轉換為鄰接列表:由節點鍵作為鍵的字典,以及包含連接節點鍵的關聯列表。
選擇一個根節點,然后使用鄰接表創建任意樹。
下面是處理這兩個任務的兩個函數:
from anytree import Node, RenderTree
from collections import defaultdict
def makegraph(edges):
adj = defaultdict(list)
for edge in edges:
a, b = edge.values()
adj[a].append(b)
adj[b].append(a)
return adj
def maketree(adj, nodekey):
visited = set()
def dfs(nodekey, parent):
if nodekey not in visited:
visited.add(nodekey)
node = Node(nodekey, parent)
for childkey in adj[nodekey]:
dfs(childkey, node)
return node
return dfs(nodekey, None)
下面是如何使用它:
edges = [
{"From": "1", "To": "2"},
{"From": "2", "To": "3"}
]
adj = makegraph(edges)
# Choose "1" as root:
root = maketree(adj, '1')
print(RenderTree(root))
# Now let's choose "2" as root:
root = maketree(adj, '2')
print(RenderTree(root))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.