【问题标题】:error 'dictionary changed size during iteration'错误'字典在迭代期间改变了大小'
【发布时间】:2023-04-02 14:29:01
【问题描述】:

我不明白当我从 list_of_dictionaries 中删除 list() 时,python 给出了这个错误 'dictionary changed size during iteration'

dissimilar_frag_dict=frag_dict
list_of_dictionary_elements=list(frag_dict.items())   #this is the problem
for s1_key,s1_value in list_of_dictionary_elements :
    for s2_key,s2_value in list_of_dictionary_elements :      
        similarity=get_similarity(s1_value,s2_value)    
        if similarity>=threshold and s1_key!=s2_key:
            max_lexicographic_order=max(s1_key,s2_key) 
            dissimilar_frag_dict.pop(max_lexicographic_order,'dne')    
print(f'number 0f dissimilar genes:{len(dissimilar_frag_dict)}')
return dissimilar_frag_dict

【问题讨论】:

  • 是的,正如错误消息所暗示的那样,您无法在迭代字典时更改字典的大小。
  • dissimilar_frag_dict=frag_dict 这不会复制字典。两个名称都指相同的字典。

标签: python python-3.x


【解决方案1】:

正如@john-gordon 所说。这一行

dissimilar_frag_dict=frag_dict 

实际上意味着将frag_dict的reference赋予dissimilar_frag_dict。它们都指向相同的内容。 list(frag_dict.items()) 给出迭代的项目字典列表。在迭代过程中运行

dissimilar_frag_dict.pop(max_lexicographic_order,'dne')

完全一样

frag_dict.pop(max_lexicographic_order,'dne')

什么来自于 dissimilar_frag_dict 引用 frag_dict 的事实。 因此字典的内容实际上在迭代过程中发生了变化。这是不允许的,因为从dict中取出的内容可能是当前的迭代值,在这种情况下下一个值将无效,触发引用的错误以避免潜在的问题。

我建议你做的是替换

dissimilar_frag_dict=frag_dict 

通过

dissimilar_frag_dict={**frag_dict}

使用旧字典的键/值对副本创建一个新字典。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-31
    • 1970-01-01
    • 2012-11-15
    • 2019-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多