python - 如何在迭代字典时从字典中删除项目?

标签 python dictionary

我可以在迭代时从 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/

相关文章:

javascript - 如何正确访问像这样的javascript "dictionary"

用于开发 Facebook 应用程序的 Python 框架

javascript - 如何在 python 中使用 selenium 驱动程序单击链接而不知道 anchor 标记内的文本

python - 如何使用 PyGithub 将图像文件上传到 Github?

list - 针对元组列表迭代现有 map

python - 如何在一个表达式中合并两个字典?

python - Pandas:创建一个以元组为键的字典

python - 是在每个类中包含一个对象还是仅在需要时包含一个对象更好?

Python - 如何读取 Windows "Media Created"日期(不是文件创建日期)

dictionary - 向下转换字典的元素