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

如何检测递归函数最后一次调用以扁平化嵌套字典生成pandas DataFrame

嵌套字典列表扁平化解决方案

问题根因

  • 原代码直接传递row_dict可变对象引用,后续递归修改会覆盖之前已存入结果的行数据
  • 每层递归结束都执行追加操作,没有判断是否为最深层级,导致大量重复冗余行

优化方案

不需要主动检测递归深度,只要判断当前层级是否还存在列表类型的子节点即可:没有子列表时即为叶子节点,此时再将当前行数据追加到结果列表。同时每次递归传递行字典的拷贝,避免不同分支的数据互相覆盖。

修正后代码

def build_dict(d, row_dict, rows):
    # 拷贝当前行字典,避免不同递归分支互相影响
    current_row = row_dict.copy()
    has_child_list = False

    for key, value in d.items():
        if not isinstance(value, list):
            current_row[key] = value
        else:
            has_child_list = True
            for child in value:
                build_dict(child, current_row, rows)
    
    # 仅当前层级无嵌套子列表时,才是最终行,追加到结果
    if not has_child_list:
        rows.append(current_row)

调用方式保持不变:

rows = []
for row in data:
    build_dict(d=row, row_dict={}, rows=rows)

效果验证

以你提供的样例结构测试:

data = [
  {
    "l_1_k": 1,
    "l_1_ch": [
      {
        "l_2_k": 2,
        "l_2_ch": [{"l_3_k": 4}]
      },
      {
        "l_2_k": 3,
        "l_2_ch": [{"l_3_k": 5}]
      }
    ]
  }
]

运行后输出的rows结果为:

[
  {'l_1_k': 1, 'l_2_k': 2, 'l_3_k': 4},
  {'l_1_k': 1, 'l_2_k': 3, 'l_3_k': 5}
]

完全符合你需要的格式,可直接用于构建pandas DataFrame。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 10:36:01