更改字典键时出错

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

以上是关于更改字典键时出错的主要内容,如果未能解决你的问题,请参考以下文章

Pandas:当字典中有多个键时,通过映射添加列

在mysql中链接外键时出错

当每个字典都有不同的键时,如何按值对字典列表进行排序?

如何仅在按下键时更改值?

将主键修改为外键时出错

当多个值共享同一个键时如何从字典中打印项目