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

如何将含父子关联的扁平字典列表转换为层级嵌套结构?

解决扁平节点列表转嵌套树形结构的问题

这个需求其实挺常见的,不用搞复杂的层级标记或者类,核心思路是先建立节点的快速查找映射,再通过父节点关联构建嵌套关系,不管节点顺序如何,甚至孙节点排在父节点前面都能完美处理。

具体实现步骤(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 06:40:24