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

如何遍历任意深度的嵌套字典并生成带路径值的副本?

问题:替换嵌套字典的叶子节点为完整路径

我有如下嵌套字典:

{'n11': 
    {'n12a':
           {'n13a': 10, 'n13b': "some text"},
     'n12b':
            {'n13c': 
                      {'n14a': 40}
            }
     },
 'n21': 
     {'n22a': 20 }
}

希望遍历该字典,直到遇到非字典类型的值,并将其替换为指向该值的完整路径,最终得到:

{'n11': 
    {'n12a':
           {'n13a': 'n11_n12a_n13a', 'n13b': 'n11_n12a_n13b'},
     'n12b':
            {'n13c': 
                      {'n14a': 'n11_n12b_n13c_n14a'}
            }
     },
 'n21': 
     {'n22a': 'n21_n22a' }
}

我已经实现了遍历嵌套字典的函数,但不知道如何生成结构相同且值已更新的字典副本:

def myprint(d,path=[]):
    for k, v in d.items():
        if isinstance(v, dict):
            path.append(k)
            myprint(v,path)
        else:
            print('_'.join(path))

# 输出:
# 'n11_n12a_n13a'
# 'n11_n12a_n13b'
# 'n11_n12b_n13c_n14a'
# 'n21_n22a'

请问如何将结果存入新字典中?


解决方案

你需要递归创建新字典,复制原结构的同时替换叶子节点为路径字符串。注意:原函数中path=[]的可变默认参数会导致递归时路径被累积修改,需要避免这个问题。

修改后的实现代码:

def replace_with_path(d, current_path=None):
    # 初始化路径,规避可变默认参数的坑
    if current_path is None:
        current_path = []
    new_dict = {}
    for k, v in d.items():
        # 生成当前键的临时路径,不修改上层路径
        temp_path = current_path + [k]
        if isinstance(v, dict):
            # 递归处理子字典,传递临时路径
            new_dict[k] = replace_with_path(v, temp_path)
        else:
            # 叶子节点替换为路径字符串
            new_dict[k] = '_'.join(temp_path)
    return new_dict

使用示例

original_dict = {'n11': {'n12a': {'n13a': 10, 'n13b': "some text"}, 'n12b': {'n13c': {'n14a': 40}}}, 'n21': {'n22a': 20}}
result_dict = replace_with_path(original_dict)
print(result_dict)

代码说明

  • 每次递归用temp_path = current_path + [k]生成独立路径,避免路径在递归层级间被污染。
  • 新建new_dict存储当前层级结构,递归处理子字典后将结果赋值对应键。
  • 非字典类型的叶子节点直接替换为下划线拼接的路径字符串。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 11:15:26