我想在一个存储计数器的字典中增加一个值:
d[key] += 1
但有时候这个键可能还不存在。检查键是否存在看起来太丑陋了。是否有一个漂亮而Pythonic的单行代码可以实现 - 如果键存在,则添加,如果键不在dict.keys中,则创建值1
?谢谢。
我想在一个存储计数器的字典中增加一个值:
d[key] += 1
但有时候这个键可能还不存在。检查键是否存在看起来太丑陋了。是否有一个漂亮而Pythonic的单行代码可以实现 - 如果键存在,则添加,如果键不在dict.keys中,则创建值1
?您可以使用
d={}
key='sundar'
d[key]=d.get(key,0)+1
print d
#output {'sundar': 1}
d[key]=d.get(key,0)+1
print d
#output {'sundar': 2}
collections.Counter
- 这保证所有值都大于等于1
,支持各种初始化方式,并支持一些 dict
/defaultdict
不支持的有用能力:from collections import Counter
values = ['a', 'b', 'a', 'c']
# Take an iterable and automatically produce key/value count
counts = Counter(values)
# Counter({'a': 2, 'c': 1, 'b': 1})
print counts['a'] # 2
print counts['d'] # 0
# Note that `counts` doesn't have `0` as an entry value like a `defaultdict` would
# a `dict` would cause a `KeyError` exception
# Counter({'a': 2, 'c': 1, 'b': 1})
# Manually update if finer control is required
counts = Counter()
for value in values:
counts.update(value) # or use counts[value] += 1
# Counter({'a': 2, 'c': 1, 'b': 1})
counts
即可。 - Jon Clements>>> import collections
>>> d = collections.defaultdict(int)
>>> key = 'foo'
>>> d[key] += 1
>>> d
defaultdict(<type 'int'>, {'foo': 1})
>>> d[key]
1
>>> d[key] += 1
>>> d[key]
2
defaultdict
在__getitem__
上触发__default__
行为,因此如果您刚刚执行了foo[key]
而它不存在,那么您将在计数器中获得一个条目key: 0
。 - Jon Clementscollections.Counter
是针对您所给出的特定用例最好的选择,但如果需要更一般化的解决方案,并且不需要导入任何模块,请使用dict.setdefault()
:
d[key] = d.setdefault(key, 0) + 1
collections.defaultdict
,try: except KeyError:
,dict.setdefault
, ... - jonrsharpecollections.Counter
... @jonrsharpe - Jon Clements