簡體   English   中英

Python JSON 到 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[?])

關於如何做到這一點的建議?

分兩步執行此操作:

  1. 將輸入格式轉換為鄰接列表:由節點鍵作為鍵的字典,以及包含連接節點鍵的關聯列表。

  2. 選擇一個根節點,然后使用鄰接表創建任意樹。

下面是處理這兩個任務的兩個函數:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM