【发布时间】:2013-02-16 00:07:43
【问题描述】:
我有一本带有字符-整数键值对的字典。我想删除所有值为 0 的键值对。
例如:
>>> hand
{'a': 0, 'i': 0, 'm': 1, 'l': 1, 'q': 0, 'u': 0}
我想把同一个字典简化成这样:
>>> hand
{'m': 1, 'l': 1}
有没有简单的方法可以做到这一点?
【问题讨论】:
标签: python
我有一本带有字符-整数键值对的字典。我想删除所有值为 0 的键值对。
例如:
>>> hand
{'a': 0, 'i': 0, 'm': 1, 'l': 1, 'q': 0, 'u': 0}
我想把同一个字典简化成这样:
>>> hand
{'m': 1, 'l': 1}
有没有简单的方法可以做到这一点?
【问题讨论】:
标签: python
您可以使用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}
【讨论】:
False 的值。如果您也有非整数值,这会略有不同。
.items 而不是.iteritems 对于较大的数据集可能效率非常低。
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 分配给新字典。
【讨论】:
iteritems,比 Niklas 的回答更好
如果你不想创建一个新的字典,你可以使用这个:
>>> 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}
>>>
【讨论】:
Traceback (most recent call last): File "<stdin>", line 1, in <module> RuntimeError: dictionary changed size during iteration
for key in list(hand.keys()):
list(hand),无需显式调用dict.keys()。
字典理解?
{k: v for k, v in hand.items() if v != 0}
在 python 2.6 及更早版本中:
dict((k, v) for k, v in hand.items() if v != 0)
【讨论】: