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

如何基于深度值对Python嵌套列表进行结构化转换?

实现嵌套层级结构转换

核心思路:利用栈追踪层级关系

针对这种带深度标记的扁平列表,最直观的实现方式是用栈记录当前遍历路径上的各层级节点,通过深度对比找到父节点,逐步构建嵌套结构。

输入输出示例

假设输入为:

input_list = [
    ["Root", 0, 0],
    ["Level1-1", 10, 1],
    ["Level2-1", 20, 2],
    ["Level1-2", 30, 1],
    ["Level2-2", 40, 2],
    ["Level3-1", 50, 3]
]

期望输出为嵌套字典结构:

{
    "name": "Root",
    "value": 0,
    "children": [
        {
            "name": "Level1-1",
            "value": 10,
            "children": [{"name": "Level2-1", "value": 20, "children": []}]
        },
        {
            "name": "Level1-2",
            "value": 30,
            "children": [
                {
                    "name": "Level2-2",
                    "value": 40,
                    "children": [{"name": "Level3-1", "value": 50, "children": []}]
                }
            ]
        }
    ]
}

可行代码实现

def build_nested_structure(input_data):
    if not input_data:
        return None
    
    # 初始化栈,存储(节点深度, 节点字典)
    stack = []
    # 构建根节点并压入栈
    root_name, root_val, root_depth = input_data[0]
    root_node = {"name": root_name, "value": root_val, "children": []}
    stack.append((root_depth, root_node))
    
    for item in input_data[1:]:
        name, val, depth = item
        current_node = {"name": name, "value": val, "children": []}
        
        # 弹出栈中深度≥当前深度的节点,找到父节点
        while stack and stack[-1][0] >= depth:
            stack.pop()
        
        # 将当前节点加入父节点的children列表
        stack[-1][1]["children"].append(current_node)
        # 当前节点压入栈,作为后续子节点的候选父节点
        stack.append((depth, current_node))
    
    return root_node

关键逻辑说明

  1. 栈的作用:栈中始终保存当前路径上的层级节点,栈顶元素是当前节点的直接父节点。
  2. 深度匹配:遍历每个元素时,通过弹出栈中深度不小于当前深度的节点,确保剩下的栈顶节点深度恰好比当前节点小1,也就是父节点。
  3. 节点挂载:将当前节点加入父节点的children列表,再把当前节点压入栈,供后续子节点使用。

注意事项

  • 若输入列表未按层级顺序排列(比如子节点出现在父节点之前),需要先对输入排序,可保留原索引保证同层级节点顺序:
    # 给每个元素添加原索引,排序后再恢复
    indexed_data = [(idx, item) for idx, item in enumerate(input_list)]
    sorted_data = sorted(indexed_data, key=lambda x: (x[1][2], x[0]))
    input_sorted = [item for idx, item in sorted_data]
    
  • 若存在多个根节点(深度为0的元素),可修改代码返回根节点列表,而非单个根节点。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 22:23:29