在 python3 中迭代字典键时无法删除它:“RuntimeError:字典在迭代期间更改了大小”

问题描述 投票:0回答:5

我试图在迭代字典时从字典中删除一个键。当从字典中删除键时,我得到:

RuntimeError: dictionary changed size during iteration

我的代码:

mydict = {'one': 1, 'two': 2, 'three': 3, 'four': 4}

for k, v in mydict.items():
    if k == 'two':
        del(mydict[k])
        continue
    print(k)

为了避免这种情况,我将同一字典复制到另一个字典,然后在迭代前一个字典时尝试从复制的字典中删除内容。但我仍然收到错误。

mydict = {'one': 1, 'two': 2, 'three': 3, 'four': 4}

new_dict = mydict
for k, v in mydict.items():
    if k == 'two':
        del(new_dict[k])
        continue
    print(k)

所以有人可以帮忙解决这个问题吗?

python python-3.x dictionary
5个回答
3
投票

对于 Python-3-x,简单的方法是在迭代中将

dict
转换为
list()

mydict = {'one': 1, 'two': 2, 'three': 3, 'four': 4}

for k, v in list(mydict.items()):
    if k == 'two':
        del(mydict[k])
        continue   
    print(k)

2
投票

迭代字典时无法删除键值对。相反,您可以使用

dict comprehension

例如:

mydict = {'one': 1, 'two': 2, 'three': 3, 'four': 4}
print({k:v for k,v in mydict.items() if k != 'two'})

输出:

{'four': 4, 'three': 3, 'one': 1}

1
投票

如果您提前知道密钥并希望将其从字典中删除:

  • 不要在迭代字典时尝试删除它。
  • 不要
  • 复制字典、迭代和删除。 不要
  • 从字典中创建元组列表,迭代并删除。
  • 相反,只需使用
  • del mydict['two']

通常,您没有理由需要在迭代时删除已知键
,特别是因为字典被认为是无序的,您无法判断何时会到达所选键。

更简单的方法是在迭代之前制作字典的浅表副本,如下所示:


0
投票

在第二个代码中仍然出现错误,因为 
new_dict

0
投票
my_dict

而不是创建另一个指向它的变量:

new_dict=my_dict.copy()
在这种情况下,浅拷贝就足够了,但如果您需要字典的深拷贝:

from copy import deepcopy
new_dict = deepcopy(my_dict)

更多信息

    

© www.soinside.com 2019 - 2024. All rights reserved.