如何将含父子关联的扁平字典列表转换为层级嵌套结构?
解决扁平节点列表转嵌套树形结构的问题
这个需求其实挺常见的,不用搞复杂的层级标记或者类,核心思路是先建立节点的快速查找映射,再通过父节点关联构建嵌套关系,不管节点顺序如何,甚至孙节点排在父节点前面都能完美处理。
具体实现步骤(Python示例)
先看完整代码,再拆解解释:
# 你的原始扁平列表 flat_nodes = [ {"name": "a"}, {"name": "b", "parent": "a"}, {"name": "c", "parent": "b"}, {"name": "d", "parent": "a"} # 加个兄弟节点演示多子节点情况 ] # 1. 构建节点映射:用节点name作为键,快速定位任何节点 node_map = {node["name"]: node.copy() for node in flat_nodes} # 用copy避免修改原数据 # 2. 遍历所有节点,构建嵌套关系 root_nodes = [] for node in flat_nodes: current_node = node_map[node["name"]] # 给当前节点初始化children列表(确保每个节点都有) current_node.setdefault("children", []) parent_name = node.get("parent") if parent_name: # 找到父节点,把当前节点加入父节点的children列表 node_map[parent_name]["children"].append(current_node) else: # 没有parent的节点就是根节点,直接加入结果列表 root_nodes.append(current_node) # 输出结果 print(root_nodes)
为什么这个方法能解决孙节点的问题?
不管节点遍历顺序如何,node_map里已经提前存储了所有节点的引用(或者副本)。比如你的例子里如果c先被遍历到,它的父节点b已经在node_map里了,直接就能把c加到b的children里;后续遍历到b的时候,又会把b加到a的children里,自然形成三层嵌套结构。
关键细节说明
- 使用
node.copy()是为了不修改原始的扁平列表数据,如果允许修改原数据,可以去掉copy()直接用node_map = {node["name"]: node for node in flat_nodes}。 setdefault("children", [])确保每个节点都有children字段,避免后续添加子节点时出错。- 根节点的判断很简单:没有
parent键或者parent值为空的节点,就是树形结构的顶层节点。
输出结果示例
运行上面的代码,你会得到符合需求的嵌套结构:
[ { "name": "a", "children": [ { "name": "b", "parent": "a", "children": [ {"name": "c", "parent": "b", "children": []} ] }, {"name": "d", "parent": "a", "children": []} ] } ]
内容的提问来源于stack exchange,提问作者erotski
相关产品推荐
相关产品推荐

