更改字典键时出错

Error Changing Dictionary Keys

我有两个 defaultdicts 我最终想合并,但首先我需要使它们的键匹配。根据我在这里看到的一些线索,我可以使用 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" 作为新密钥。

我想 post 变量 "key" 和字典 "old_dict" 我正在使用它来测试这段代码,但是它很乱并且占用了很多空间 space.所以 here's 一个包含它们的 pastebin link。

请注意,"umi" 来自变量 "key",由制表符分隔。所以我拆分 "key" 并将第一个对象作为 "umi".

只需为此使用字典理解:

new_dict = {split_tabs(key)[0]: value for key, value in old_dict.iteritems()}

在遍历字典的同时尝试修改它通常不是一个好主意。

如果您使用 .items() 而不是 .iteritems(),您将不会遇到这个问题,因为那只是 return 一个与字典断开连接的列表。在 python 3 中,它将是 'list(new_dict.items())`。

此外,如果字典值有可能可变,您将不得不使用 copy.deepcopy(old_dict) 而不是 old_dict.copy().