【发布时间】:2012-10-11 03:00:49
【问题描述】:
在 Python 中,在递增之前必须先检查一个键是否在字典中,这很烦人:
if key in my_dict:
my_dict[key] += num
else:
my_dict[key] = num
上面的四行有更短的替代品吗?
【问题讨论】:
-
你可以对两个值做同样的事情吗?
标签: python dictionary increment
在 Python 中,在递增之前必须先检查一个键是否在字典中,这很烦人:
if key in my_dict:
my_dict[key] += num
else:
my_dict[key] = num
上面的四行有更短的替代品吗?
【问题讨论】:
标签: python dictionary increment
另一种选择是:
my_dict[key] = my_dict.get(key, 0) + num
【讨论】:
dict 没有提供在单个表达式中访问多个元素的方法,我不知道如何。
您有很多选择。我喜欢使用Counter:
>>> from collections import Counter
>>> d = Counter()
>>> d[12] += 3
>>> d
Counter({12: 3})
>>> 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})
【讨论】:
lambda: 0,你可以直接说int。
Counter也支持默认的0功能。到目前为止,我一直在使用 Nicola 的解决方案,但没有它会更好。
【讨论】:
变换:
if key in my_dict:
my_dict[key] += num
else:
my_dict[key] = num
使用setdefault:
my_dict[key] = my_dict.setdefault(key, 0) + num
【讨论】:
还有一点点不一样的setdefault方式:
my_dict.setdefault(key, 0)
my_dict[key] += num
如果结合其他逻辑可能会有一些优势。
【讨论】:
.get 或.setdefault 中的任何一个都可以使用:
.get()如果没有有效的键,则在函数中传递默认值
my_dict[key] = my_dict.get(key, 0) + num
.setdefault ()创建一个传递默认值的键
my_dict[key] = my_dict.setdefault(key, 0) + num
【讨论】: