删除具有特定值的字典键

时间:2013-06-13 19:11:55

标签: python

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

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

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

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

4 个答案:

答案 0 :(得分:15)

修改原始字典:

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

或使用dict comprehension创建一个新的dict:

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

来自iteritems()iterkeys()itervalues()上的docs

  

添加或时使用iteritems()iterkeys()itervalues()   删除字典中的条目可能会引发RuntimeError或失败   迭代所有条目。

同样适用于普通for key in dic:循环。

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

答案 1 :(得分:3)

你需要确保在迭代时不要修改字典,否则你会得到RuntimeError: dictionary changed size during iteration

因此,您需要迭代密钥的值副本(d使用2.x中的d.items()或3.x中的list(d.items())

>>> d = {'NameofEntry1': '0', 'NameofEntry2': 'DNC'}
>>> for k,v in d.items():
...     if v == 'DNC':
...         del d[k]
... 
>>> d
{'NameofEntry1': '0'}

答案 2 :(得分:1)

这应该有效:

for key, value in dic.items():
     if value == 'DNC':
         dic.pop(key)

答案 3 :(得分:0)

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

子类字典,并覆盖__setitem____delitem__poppopitemclear

如果这是一项你正在做很多事的操作,那可能会方便快捷。