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

如何基于父子关系构建嵌套树形字典?

递归实现父节点列表转树形字典

这问题我之前处理树形结构时也碰到过,递归确实是最适合的解法,我来给你一步步拆解实现过程:

第一步:先整理父-子节点映射

首先,你给出的输入是多个单键字典组成的列表,这种结构不方便快速查找某个父节点对应的子节点。我们先把它合并成一个统一的父节点到子节点列表的映射字典:

input_list = [ {'A': ['B', 'C', 'D']}, {'B': ['E', 'F']}, {'C': ['E']}, {'F': ['G', 'H']} ]

# 合并成统一的映射字典
parent_child_map = {}
for item in input_list:
    # 每个字典只有一个键值对,直接取第一个键值对
    parent, children = next(iter(item.items()))
    parent_child_map[parent] = children

执行后会得到这样的映射:

{'A': ['B', 'C', 'D'], 'B': ['E', 'F'], 'C': ['E'], 'F': ['G', 'H']}

第二步:编写递归构建树形结构的函数

接下来写递归函数,核心逻辑是:

  • 传入当前节点和映射字典,判断该节点是否有子节点
  • 如果没有子节点(不在映射字典中),返回None
  • 如果有子节点,遍历每个子节点,递归调用函数生成子树,最终返回当前节点的树形字典
def build_tree(current_node, parent_map):
    # 当前节点没有子节点,返回None
    if current_node not in parent_map:
        return None
    
    # 初始化当前节点的子树
    subtree = {}
    # 遍历每个子节点,递归构建子树
    for child in parent_map[current_node]:
        subtree[child] = build_tree(child, parent_map)
    
    return subtree

第三步:生成最终的树形字典

最后,以根节点(这里是'A')为起点,调用递归函数生成完整的树:

# 构建完整树形字典
result = { 'A': build_tree('A', parent_child_map) }
print(result)

执行后会输出你想要的结构(注意你的示例里漏了'D': None,程序会自动补上):

{'A': {'B': {'E': None, 'F': {'G': None, 'H': None}}, 'C': {'E': None}, 'D': None}}

补充:自动查找根节点(可选)

如果不知道根节点是谁,可以通过以下方式自动查找(根节点是没有出现在任何子节点列表中的节点):

# 收集所有子节点
all_children = set()
for children in parent_child_map.values():
    all_children.update(children)

# 根节点是不在子节点集合中的父节点
root_nodes = [node for node in parent_child_map if node not in all_children]
# 假设只有一个根节点,取第一个
root = root_nodes[0]

# 生成树
result = { root: build_tree(root, parent_child_map) }

这样不管输入的根节点是什么,都能自动识别并构建树形结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 03:53:13