如何拼接嵌套字典层级key 实现保留路径的字典扁平化
实现思路
你原代码存在两个核心问题:一是递归遍历嵌套字典时没有传递上层key的路径,二是赋值时误用了集合{key}作为字典键,不符合预期。修改思路如下:
- 给
extract_data方法增加parent_key参数,用于记录当前层级的父key拼接路径 - 递归遍历子字典时,将当前层级key拼接到父路径后传入下一层
- 根层级无父key,避免多余的下划线前缀
修改后完整代码
class Simple: def __init__(self): self.store_data = {} def extract_data(self, config, parent_key=''): for key in config: # 拼接当前完整key路径,父key为空时直接用当前key,否则用下划线连接 current_key = f"{parent_key}_{key}" if parent_key else key if isinstance(config[key], dict): # 递归传入当前拼接的key作为下一层的父key self.extract_data(config[key], current_key) else: self.store_data[current_key] = config[key] return self.store_data
测试验证
# 测试输入(避免覆盖内置函数input,改用input_dict命名) input_dict = { 'k1_lv1': { 'k1_lv2': 'v1_lv2', 'k2_lv2': 'v2_lv2'}, 'k2_lv1': 'v1_lv1', 'k3_lv1': { 'k1_lv2': 'v1_lv2', 'k2_lv2': 'v2_vl2'}, 'k4_lv1': 'v1_lv1', } s = Simple() output = s.extract_data(input_dict) print(output)
输出结果完全符合你的预期:
{ 'k1_lv1_k1_lv2': 'v1_lv2', 'k1_lv1_k2_lv2': 'v2_lv2', 'k2_lv1': 'v1_lv1', 'k3_lv1_k1_lv2': 'v1_lv2', 'k3_lv1_k2_lv2': 'v2_vl2', 'k4_lv1': 'v1_lv1' }
该实现天然支持任意深度的嵌套字典场景,如果你需要自定义分隔符,只需要把下划线替换为可配置的参数即可。
内容的提问来源于stack exchange,提问作者htodev
相关产品推荐
相关产品推荐

