【问题标题】:Python dictionary keys changed during iteration [duplicate]Python字典键在迭代期间更改[重复]
【发布时间】:2021-07-26 04:04:12
【问题描述】:

我有一个这样的字典:

     d={
         'McAfee': {'DatDate': '123','DatVersion': '456'},
         'AntiVirus': {'AVName': ['Mac Defender', 'Windows Defender'],'AVVersion': ['262144', '393472']}
       }

现在我想根据这个映射改变 d 的键,也改变 d 的值的键:

mapping_table = {"McAfee":'Mc_table','AntiVirus':'An_table'}

mapping_coulmn = {'DatDate':"Dc_column",'AVName':'Av_column','DatVersion':'Da_column','AVVersion':'AVV_column'}

输出应该是这样的:

 d={
    'Mc_table': {'Dc_column': '123','Da_column': '456'},
    'An_table': {'Av_column': ['Mac Defender', 'Windows Defender'],'AVV_column': ['262144', '393472']}
    }

我累的是:

for key in d:
    if key in mapping_table:
        new_key = mapping_table[key]
        d1[new_key]=d.pop(key)
        
print(d)

它返回一个错误:

RuntimeError: dictionary keys changed during iteration

有朋友可以帮忙吗?非常感谢!

【问题讨论】:

  • 是否必须原地修改字典而不是返回新字典?
  • 我不知道是谁编辑了这个问题并说它是重复的,它很相似但根本不重复,我要求编辑我的问题的人删除重复的标签!
  • 为什么不是重复的? d.pop(key) 从字典中删除。另一个问题解释了如何在循环遍历字典时从字典中删除。
  • 在那个问题中,这个人想删除密钥,但我想替换密钥,我的 dict 结构嵌套了他的不是。
  • 无法直接替换密钥。您所能做的就是删除旧密钥并添加一个新密钥,这就是您正在做的事情。但是您不能在迭代时修改键。另一个问题提供了解决方案。

标签: python python-3.x dictionary key python-3.5


【解决方案1】:
d = {
    mapping_table.get(k, k): {
        mapping_column.get(kk, kk): vv for kk, vv in v.items()
    }
    for k, v in d.items()
}
print(d)

打印:

{'Mc_table': {'Dc_column': '123', 'Da_column': '456'}, 
 'An_table': {'Av_column': ['Mac Defender', 'Windows Defender'], 
              'AVV_column': ['262144', '393472']}}

【讨论】:

  • 非常感谢您的回答,您能否对这一行添加一些解释:vv for kk, vv in v.items()
  • @William mapping_column.get(kk, kk): vv for kk, vv in v.items() 这一行将遍历字典中的每个键、值,然后尝试使用 mapping_column.get(kk, kk) 将映射应用于键(我使用 .get(),因为如果值在映射中未找到,则返回原始键 - 而不是错误)
  • 你如何迭代或循环如此大的逻辑只使用 1 行?请教教我!!对我来说,首先我会在 mapping_column 中使用类似 for key 的东西:....但你只使用 1 行!!!
  • @William Python 具有字典理解的概念(也适用于列表和集合)。学习它们真的很有用。 stackoverflow.com/questions/14507591/…
  • 你能告诉我,这行是什么意思:vv for kk, vv in v.items(), 和 for vv in kk 一样吗?!
猜你喜欢
  • 2022-10-25
  • 2021-11-21
  • 2015-03-31
  • 2016-09-29
  • 1970-01-01
  • 1970-01-01
  • 2011-05-13
  • 1970-01-01
相关资源
最近更新 更多