6

我知道字典不应该以这种方式使用,因此没有内置函数可以帮助做到这一点,但我需要删除字典中具有特定值的每个条目。

所以如果我的字典看起来像:

'NameofEntry1': '0'
'NameofEntry2': 'DNC'
 ...

我需要删除(可能弹出)所有具有 DNC 值的条目,字典中有多个条目。

4

4 回答 4

22

修改原始字典:

for k,v in your_dict.items():
    if v == 'DNC':
       del your_dict[k]

或使用字典理解创建一个新字典:

your_dict = {k:v for k,v in your_dict.items() if v != 'DNC'}

从上的文档iteritems()iterkeys()itervalues()

使用iteritems(),iterkeys()itervalues()在字典中添加或删除条目时可能会引发 aRuntimeError或无法遍历所有条目。

同样适用于正常for key in dict:循环。

在 Python 3 中,这适用于 dict.keys(),dict.values()dict.items().

于 2013-06-13T19:15:35.440 回答
9

您只需要确保在迭代字典时没有修改字典,否则您会得到RuntimeError: dictionary changed size during iteration.

因此,您需要遍历键、值的副本(用于d2.xd.items()list(d.items())3.x)

>>> d = {'NameofEntry1': '0', 'NameofEntry2': 'DNC'}
>>> for k,v in d.items():
...     if v == 'DNC':
...         del d[k]
... 
>>> d
{'NameofEntry1': '0'}
于 2013-06-13T19:16:31.120 回答
2

这应该有效:

for key, value in dic.items():
     if value == 'DNC':
         dic.pop(key)
于 2013-06-13T19:16:21.523 回答
0

如果限制重新:在迭代字典时修改字典是一个问题,您可以创建一个与 dict 兼容的新类,该类存储具有给定值的所有键的反向索引(在创建/更新/删除 dict 项时更新),这可以是 del 的参数,而无需迭代字典的项目。

子类dict 和 override __setitem____delitem__pop和.popitemclear

如果这是您经常进行的一项操作,那可能既方便又快捷。

于 2013-06-13T20:22:29.153 回答