我最终想要合并两个默认设置,但首先我需要让它们的密钥匹配。根据我在这里看到的一些主题,我可以使用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('\t')
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"。
答案 0 :(得分:0)
只需使用dict理解:
new_dict = {split_tabs(key)[0]: value for key, value in old_dict.iteritems()}
在迭代时尝试修改字典通常不是一个好主意。
答案 1 :(得分:0)
如果您使用.items()
代替.iteritems()
,则不会出现此问题,因为这只会返回与字典断开连接的列表。在python 3中,它将是'list(new_dict.items())`。
此外,如果字典值有可能变化,则必须使用copy.deepcopy(old_dict)
而不是old_dict.copy()
。