如何在遍历字典时从字典中删除项目?

新手上路,请多包涵

我可以在迭代时从 Python 字典中删除项目吗?

我想从字典中删除不满足特定条件的元素,而不是创建一个全新的字典。以下是一个好的解决方案,还是有更好的方法?

 for k, v in mydict.items():
    if k == val:
        del mydict[k]

原文由 user248237 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 342
2 个回答

对于 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 ,但 raise a RuntimeError 用于 Python 3

RuntimeError:字典在迭代期间改变了大小。

发生这种情况是因为 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() 方法:

 >>> for k, v in mydict.items():
...     if v == 3:
...         del mydict[k]

>>> mydict
{'four': 4, 'one': 1}

原文由 Blair 发布,翻译遵循 CC BY-SA 4.0 许可协议

您也可以分两步完成:

 remove = [k for k in mydict if k == val]
for k in remove: del mydict[k]

我最喜欢的方法通常是制作一个新的字典:

 # Python 2.7 and 3.x
mydict = { k:v for k,v in mydict.items() if k!=val }
# before Python 2.7
mydict = dict((k,v) for k,v in mydict.iteritems() if k!=val)

原文由 Jochen Ritzel 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题