我可以在迭代时从 Python 中的字典中删除项目吗?
我想从字典中删除不满足特定条件的元素,而不是创建一个全新的字典。以下是一个好的解决方案,还是有更好的方法?
for k, v in mydict.items():
if k == val:
del mydict[k]
最佳答案
对于 Python 3+:
>>> mydict
{'four': 4, 'three': 3, 'one': 1}
>>> for k in list(mydict.keys()):
... if mydict[k] == 3:
... del mydict[k]
>>> mydict
{'four': 4, 'one': 1}
其他答案适用于 Python 2,但会为 Python 3 引发 RuntimeError
:
RuntimeError: dictionary changed size during iteration.
发生这种情况是因为 mydict.keys()
返回的是迭代器而不是列表。
正如评论中指出的那样,只需将 mydict.keys()
转换为 list(mydict.keys())
的列表,它应该可以工作。
对于 Python 2:
控制台中的一个简单测试表明您无法在迭代字典时对其进行修改:
>>> mydict = {'one': 1, 'two': 2, 'three': 3, 'four': 4}
>>> for k, v in mydict.iteritems():
... if k == 'two':
... del mydict[k]
------------------------------------------------------------
Traceback (most recent call last):
File "<ipython console>", line 1, in <module>
RuntimeError: dictionary changed size during iteration
正如 delnan 的回答中所述,当迭代器尝试移动到下一个条目时,删除条目会导致问题。相反,使用 keys()
方法获取键列表并使用它:
>>> for k in mydict.keys():
... if k == 'two':
... del mydict[k]
>>> mydict
{'four': 4, 'three': 3, 'one': 1}
如果需要根据 items 值删除,请改用 items()
方法:
>>> for k, v in mydict.items():
... if v == 3:
... del mydict[k]
>>> mydict
{'four': 4, 'one': 1}
关于python - 如何在迭代字典时从字典中删除项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5384914/