微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何在迭代字典时从字典中删除项目?

对于 (或更高版本):

>>> 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}

其余答案适用于 Python2* ,但不适用于 和 raises 。 *RuntimeError

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

发生这种情况是因为mydict.keys()返回一个迭代器而不是一个列表。正如评论中指出的那样,只需转换mydict.keys()为列表list(mydict.keys()),它应该可以工作。


对于 :

控制台中的一个简单测试表明您在迭代字典时无法修改字典:

>>> 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 字典中删除项目是否合法?

例如:

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

这个想法是从字典中删除不满足特定条件的元素,而不是创建一个新字典,它是被迭代的字典的子集。

这是一个好的解决方案吗?有没有更优雅/高效的方法?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。