使用任意树将Python JSON转换为树

kx5bkwkv  于 2023-02-02  发布在  Python
关注(0)|答案(1)|浏览(239)

我有JSON数据,看起来像

{'Tree': [
  {"From": "1",
  "To": "2"},
  {"From": "2",
  "To": "3"}
]}

基本上是一个数组的所有现有的引用之间的节点。2我希望能够画树开始从一个选定的根节点使用这些数据。
我发现使用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[?])

如何做到这一点的建议?

pcww981p

pcww981p1#

请分两步执行此操作:
1.将输入格式转换为邻接列表:由节点关键字作为关键字的字典,并且具有保存所连接的节点的关键字的关联列表。
1.选择一个根节点,然后使用邻接列表创建任意树。
下面是处理这两个任务的两个函数:

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))

相关问题