Python字典的增量

48

在Python中,必须先检查字典中是否存在某个键,然后才能对其进行递增操作,这很麻烦:

if key in my_dict:
  my_dict[key] += num
else:
  my_dict[key] = num

上面的四行代码有没有更简短的替代方法?


你能为两个值做同样的事情吗? - Mohsin
7个回答

87

另一种选择是:

my_dict[key] = my_dict.get(key, 0) + num

1
你能为多个值做到吗?我的意思是增加不止一个值。 - Mohsin
1
没有循环?由于“dict”不提供在单个表达式中访问多个元素的方法,因此我不知道如何做到这一点。 - Nicola Musatti
使用循环,就像OP在问题中所写的那样,但每个键增加两个值而不是一个。 - Mohsin
1
我认为你应该针对那个问题提出一个新的问题。 - Nicola Musatti

33

你有很多选择。我喜欢使用Counter

>>> from collections import Counter
>>> d = Counter()
>>> d[12] += 3
>>> d
Counter({12: 3})

或者defaultdict

>>> from collections import defaultdict
>>> d = defaultdict(int)  # int() == 0, so the default value for each key is 0
>>> d[12] += 3
>>> d
defaultdict(<function <lambda> at 0x7ff2fe7d37d0>, {12: 3})

2
对于 lambda: 0,你可以简单地说 int - hughdbrown
2
@hughdbrown:谢谢,我以前不知道这个。 - Blender
@hughdbrown 如果没有你的评论,我永远不会理解defaultdict在做什么。谢谢。 - Noel Evans
很遗憾文档没有提到 Counter 也支持默认的0功能。我一直在使用Nicola的解决方案,但没有它更好。 - Czechnology

9

8

transform:

if key in my_dict:
  my_dict[key] += num
else:
  my_dict[key] = num

使用setdefault将以下内容转换为:

my_dict[key] = my_dict.setdefault(key, 0+ num

4

还有一种略微不同的setdefault方法:

my_dict.setdefault(key, 0)
my_dict[key] += num

如果与其他逻辑组合使用,可能会带来一些优势。


1
一个缩短条件的解决方案可以是以下示例:
dict = {}
dict['1'] = 10
dict['1'] = dict.get('1', 0) + 1 if '1' in dict else 1
print(dict)

2
“dict”是字典类型的内置名称。该答案在功能上等同于已被接受的答案,但使用了不必要的内联if函数。 - user_na

0
任何一个 .get.setdefault 都可以使用: .get() 如果没有有效的键,则在函数中传递默认值。
my_dict[key] = my_dict.get(key, 0) + num

.setdefault() 创建一个带有默认值的键

my_dict[key] = my_dict.setdefault(key, 0) + num

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