如何向字典中添加值,若不存在则创建

12

我想在一个存储计数器的字典中增加一个值:

d[key] += 1
但有时候这个键可能还不存在。检查键是否存在看起来太丑陋了。是否有一个漂亮而Pythonic的单行代码可以实现 - 如果键存在,则添加,如果键不在dict.keys中,则创建值1
谢谢。

你有几个选项 - collections.defaultdict, try: except KeyError:, dict.setdefault, ... - jonrsharpe
1
根据行为,还可以使用collections.Counter... @jonrsharpe - Jon Clements
4个回答

19

您可以使用

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}

4
事实上,我喜欢它,我希望每个负评都需要添加注释成为强制要求。 - Pablo Francisco Pérez Hidalgo
@WeaselFox 知道如果他们要点踩,就必须有限制,他们需要发表评论才能使点踩有效:( - sundar nataraj

10
你可以使用 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})

但是后来他将新元素添加到列表中,因此必须再次遵循以下答案之一,对吧? - sundar nataraj
这可能是最好的答案。谢谢。 - WeaselFox
@sundar,你只需像第二个示例中展示的那样更新原始的 counts 即可。 - Jon Clements
第二个例子解决了所有问题。这真是一个很棒的小附加功能。 - blissweb

7
>>> 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

很好。我就知道一定有更好的方法。 - WeaselFox
4
@WeaselFox请注意谨慎执行操作... defaultdict__getitem__上触发__default__行为,因此如果您刚刚执行了foo[key]而它不存在,那么您将在计数器中获得一个条目key: 0 - Jon Clements

3

collections.Counter 是针对您所给出的特定用例最好的选择,但如果需要更一般化的解决方案,并且不需要导入任何模块,请使用dict.setdefault()

d[key] = d.setdefault(key, 0) + 1

1
注意:使用此语法时,setdefault 的第二个参数不应该是默认值,而应该是默认值减 1。这是因为末尾的 +1 总会将其加 1。 - doublefelix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接