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

Python中带level列的扁平数据转树形结构方案咨询

问题

给定如下扁平层级数据:

[
    {
        "level":0,
        "name":"python"
    },
    {
        "level":1,
        "name":"food"
    },
    {
        "level":2,
        "name":"banana"
    },
    {
        "level":3,
        "name":"protein"
    },
    {
        "level":2,
        "name":"apple"
    },
    {
        "level":1,
        "name":"fuel"
    }
]

需要将其转换为嵌套树形结构:

[
    {
        "level":0,
        "name":"python",
        "children":[
            {
                "level":1,
                "name":"food",
                "children":[
                    {
                        "level":2,
                        "name":"banana",
                        "children":[
                            {
                                "level":3,
                                "name":"protein",
                                "children":[]
                            }
                        ]
                    },
                    {
                        "level":2,
                        "name":"apple",
                        "children":[]
                    }
                ]
            },
            {
                "level":1,
                "name":"fuel",
                "children":[]
            }
        ]
    }
]

要求用Python实现,不依赖外部库或pandas。

解决方案

可以通过维护一个层级栈跟踪当前各层级的父节点,遍历扁平数据时根据节点的level找到对应父节点,将其添加到父节点的children列表中。

实现代码如下:

def flat_to_tree(flat_data):
    tree = []
    level_stack = []  # 栈中保存各层级的最后一个节点,索引对应level值
    
    for item in flat_data:
        # 复制当前元素并初始化children列表
        node = item.copy()
        node['children'] = []
        
        current_level = node['level']
        
        # 调整栈长度,确保栈能对应到当前层级的父级
        while len(level_stack) > current_level:
            level_stack.pop()
        
        if current_level == 0:
            # 根节点直接加入树并压入栈
            tree.append(node)
            level_stack.append(node)
        else:
            # 父节点是栈中最后一个元素
            parent_node = level_stack[-1]
            parent_node['children'].append(node)
            # 当前层级为下一层时,压入栈
            if len(level_stack) == current_level:
                level_stack.append(node)
    
    return tree

# 测试数据
flat_data = [
    {"level":0,"name":"python"},
    {"level":1,"name":"food"},
    {"level":2,"name":"banana"},
    {"level":3,"name":"protein"},
    {"level":2,"name":"apple"},
    {"level":1,"name":"fuel"}
]

# 转换并打印格式化结果
import json
tree = flat_to_tree(flat_data)
print(json.dumps(tree, indent=2))

代码说明

  • 层级栈level_stack:栈内元素对应不同层级的节点,栈的长度等于当前最高层级+1。例如处理level=3的节点时,栈中会保存level0、level1、level2的节点。
  • 节点处理逻辑:
    1. 复制原始节点并添加空的children列表,避免修改原数据。
    2. 根据当前节点的level调整栈:若栈长度大于current_level,说明当前节点是上一级的兄弟节点,弹出栈中多余元素直到栈长度匹配current_level。
    3. 根节点直接加入结果树并压入栈;非根节点找到栈顶的父节点,将自身加入父节点的children,若当前层级为下一层级则压入栈。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 22:21:37