2013-03-01 29 views
21

我有一个带有字符整数键值对的字典。我想删除所有的键值对,其中的值是0基于值从字典中删除条目

例如:

>>> hand 
{'a': 0, 'i': 0, 'm': 1, 'l': 1, 'q': 0, 'u': 0} 

我想减少相同的字典这样:

>>> hand 
{'m': 1, 'l': 1} 

有一个简单的如何做到这一点?

+0

看到this..http://stackoverflow.com/questions/5447494/best-way-to-remove -on-item-from-python-dictionary – 2013-03-01 13:15:01

回答

19

您可以使用dict comprehension

>>> { k:v for k, v in hand.items() if v } 
{'m': 1, 'l': 1} 

或者,在前期2.7 Python中,dict构造结合一个generator expression

>>> dict((k, v) for k, v in hand.iteritems() if v) 
{'m': 1, 'l': 1} 
+2

请注意,这会删除评估为“False”的所有值。如果您还有非整数值,则这个值会有细微的差别。 – 2013-03-01 13:24:22

+0

@Lattyware:它看起来像OP只有整数作为值...我只能用我得到:) – 2013-03-01 13:37:19

+0

使用'.items'而不是'.iteritems'对于更大的数据集可能是非常低效的。 – Don 2014-08-28 14:24:20

2

字典理解?

{k: v for k, v in hand.items() if v != 0} 

在蟒蛇2.6和更早的版本:

dict((k, v) for k, v in hand.items() if v != 0) 
9
hand = {k: v for k, v in hand.iteritems() if v != 0} 

预Python 2.7版:

hand = dict((k, v) for k, v in hand.iteritems() if v != 0) 

在这两种情况下,你会过滤掉其值0的钥匙,并分配hand新字典。

+0

IMO:比使用'iteritems'好得多Niklas'回答 – Don 2014-08-28 14:25:17

6

如果你不希望创建一个新的字典,您可以使用此:

>>> hand = {'a': 0, 'i': 0, 'm': 1, 'l': 1, 'q': 0, 'u': 0} 
>>> for key in list(hand.keys()): ## creates a list of all keys 
...  if hand[key] == 0: 
...    del hand[key] 
... 
>>> hand 
{'m': 1, 'l': 1} 
>>> 
+2

Python 3中不允许这样做:'Traceback(最近调用最后一个): 文件“”,第1行,在 RuntimeError:dictionary迭代期间更改大小 – bugmenot123 2016-04-29 13:07:58

+5

@ bugmenot123尝试列表中的键(hand.keys()):' – Fabian 2016-04-30 18:49:41

+0

谢谢!我自己结束了这个解决方案,但忘记了我发布在这里。 :) – bugmenot123 2016-04-30 20:57:56