更改字典键时出错
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了更改字典键时出错相关的知识,希望对你有一定的参考价值。
我有两个默认配置,我最终想要合并,但首先我需要让它们的键匹配。根据我在这里看到的一些线程,我可以使用pop()来替换字典中的键。但是这只会更新现有字典,而我想用新密钥创建一个新字典。所以类似于:
existing_dict_one - > new_dict_one
这是我到目前为止:
def split_tabs(x):
"""
Function to split tab-separated strings, used to break up the keys that are separated by tabs.
"""
return x.split(' ')
def create_dict(old_dict):
"""
Function to create a new defaultdict from an existing defaultdict, just with
different keys.
"""
new_dict = old_dict.copy() # Create a copy of old_dict to house the new keys, but with the same values.
for key, value in new_dict.iteritems():
umi = split_tabs(key)[0] # Change key to be UMI, which is the 0th index of the tab-delimited key.
# new_key = key.replace(key, umi)
new_dict[umi] = new_dict.pop(key)
return new_dict
但是,我收到以下错误
RuntimeError: dictionary changed size during iteration
我不知道如何解决它。有谁知道如何纠正它?我想使用变量“umi”作为新密钥。
我想发布变量“key”和字典“old_dict”我正在使用它来测试这段代码,但它很乱,占用了大量空间。所以here's是一个包含它们的pastebin链接。
请注意,“umi”来自变量“key”,它由制表符分隔。所以我拆分“键”并将第一个对象称为“umi”。
答案
只需使用dict理解:
new_dict = {split_tabs(key)[0]: value for key, value in old_dict.iteritems()}
在迭代它时尝试修改字典通常不是一个好主意。
另一答案
如果你使用.items()
而不是.iteritems()
,你将不会遇到这个问题,因为那只会返回一个与字典断开连接的列表。在python 3中,它将是'list(new_dict.items())`。
此外,如果字典值有可能是可变的,你将不得不使用copy.deepcopy(old_dict)
而不仅仅是old_dict.copy()
。
以上是关于更改字典键时出错的主要内容,如果未能解决你的问题,请参考以下文章