在 python3 中迭代另一个字典时无法删除字典键

问题描述 投票: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个回答
2
投票

对于 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)

1
投票

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

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}

0
投票

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

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

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

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


0
投票

您在第二个代码中仍然遇到错误,因为 new_dict 只是引用同一对象的另一个变量。您可以简单地复制 my_dict 而不是创建另一个指向它的变量。

-1
投票

遗憾的是 dict 没有深拷贝方法,所以必须导入:

from copy import deepcopy
new_dict=deepcopy(my_dict)

欲了解更多信息,请查看

此处

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