如何基于父子关系构建嵌套树形字典?
递归实现父节点列表转树形字典
这问题我之前处理树形结构时也碰到过,递归确实是最适合的解法,我来给你一步步拆解实现过程:
第一步:先整理父-子节点映射
首先,你给出的输入是多个单键字典组成的列表,这种结构不方便快速查找某个父节点对应的子节点。我们先把它合并成一个统一的父节点到子节点列表的映射字典:
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
相关产品推荐
相关产品推荐

