You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用anytree将节点关联关系JSON转换为树形结构?

实现方案

核心是用一个字典来映射节点名称到节点对象,这样就能通过节点名称直接找到对应的父节点实例,不用手动维护节点的索引关系。具体步骤如下:

  • 先初始化一个空字典,用来存储节点名称和对应Node对象的映射
  • 创建根节点(比如你的数据里的"1"),并把它加入字典
  • 遍历你的节点关联数组,对每一组From和To:
    1. 从字典中取出From对应的父节点对象
    2. 用To创建子节点,并将父节点对象传入
    3. 把新创建的子节点也存入字典,供后续节点关联使用

完整代码示例

from anytree import Node, RenderTree

# 你的节点关联数据(修正为标准JSON格式)
tree_data = {
    'Tree': [
        {"From": "1", "To": "2"},
        {"From": "2", "To": "3"}
    ]
}

# 节点名称到Node对象的映射字典
node_map = {}

# 创建根节点(这里指定"1"为根,若根不固定可先自动识别)
root_node = Node("1")
node_map["1"] = root_node

# 遍历关联关系构建树形结构
for relation in tree_data['Tree']:
    parent_name = relation["From"]
    child_name = relation["To"]
    # 通过名称从字典获取父节点对象
    parent_node = node_map[parent_name]
    # 创建子节点并关联父节点
    child_node = Node(child_name, parent=parent_node)
    # 将新节点加入映射字典
    node_map[child_name] = child_node

# 打印验证树形结构
for pre, fill, node in RenderTree(root_node):
    print(f"{pre}{node.name}")

扩展:自动识别根节点

如果你的根节点不固定,可以先遍历所有关联关系,找出没有出现在To字段里的节点作为根:

# 收集所有出现的节点名称
all_nodes = set()
# 收集所有子节点名称(即To字段的值)
child_nodes = set()
for relation in tree_data['Tree']:
    all_nodes.add(relation["From"])
    all_nodes.add(relation["To"])
    child_nodes.add(relation["To"])
# 根节点是不在子节点集合里的节点
root_names = all_nodes - child_nodes
# 若只有一个根节点,直接创建
if len(root_names) == 1:
    root_name = root_names.pop()
    root_node = Node(root_name)
    node_map[root_name] = root_node

内容的提问来源于stack exchange,提问作者neveratdennys

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 07:10:28