我有一本词典

 {'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' }
 }

我知道如何使用以下函数迭代嵌套的字典,但我不知道如何复制相同的 struct ,而是使用更新后的值.

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

  output:
  'n11_n12a_n13a'
  'n11_n12a_n13b'
  'n11_n12b_n13c_n14a'
  'n21_n22a'

但是我怎么才能把它编入另一本词典呢?

推荐答案

要做到这一点,最有效的方法是使用相同的递归函数,而不会产生额外的性能开销.要复制词典,您可以使用copy.deepcopy(),然后通过函数获取该副本,但要替换这些值,而不只是打印路径:

import copy


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


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


copy_of_data = copy.deepcopy(data)
copy_of_data = myreplace(copy_of_data)
print(data)
print(copy_of_data)

我不得不对原来的函数稍作修改才能使其正常工作.

Python相关问答推荐

Gekko解算器错误results.json未找到,无法找出原因

两极:滚动组,起始指数由不同列设置

回归回溯-2D数组中的单词搜索

Python中的锁定类和线程以实现dict移动

使用argsorted索引子集索引数组

使用Ubuntu、Python和Weasyprint的Docker文件-venv的问题

有什么方法可以避免使用许多if陈述

Python plt.text中重叠,包adjust_text不起作用,如何修复?

Python中MongoDB的BSON时间戳

使用SciPy进行曲线匹配未能给出正确的匹配

Python上的Instagram API:缺少client_id参数"

将输入管道传输到正在运行的Python脚本中

优化pytorch函数以消除for循环

如何从.cgi网站刮一张表到rame?

将JSON对象转换为Dataframe

Scrapy和Great Expectations(great_expectations)—不合作

无法连接到Keycloat服务器

如何从需要点击/切换的网页中提取表格?

AES—256—CBC加密在Python和PHP中返回不同的结果,HELPPP

人口全部乱序 - Python—Matplotlib—映射