更改字典键时出错

时间:2018-01-03 22:26:44

标签: python dictionary key defaultdict

我最终想要合并两个默认设置,但首先我需要让它们的密钥匹配。根据我在这里看到的一些主题,我可以使用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"。

2 个答案:

答案 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()