如何检测递归函数最后一次调用以扁平化嵌套字典生成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
相关产品推荐
相关产品推荐

