如何遍历任意深度的嵌套字典并生成带路径值的副本?
问题:替换嵌套字典的叶子节点为完整路径
我有如下嵌套字典:
{'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
相关产品推荐
相关产品推荐

