Python字典增量

Posted

技术标签:

【中文标题】Python字典增量【英文标题】:Python dictionary increment 【发布时间】:2012-10-11 03:00:49 【问题描述】:

在 Python 中,在递增之前必须先检查一个键是否在字典中,这很烦人:

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

上面的四行有更短的替代品吗?

【问题讨论】:

你可以对两个值做同样的事情吗? 【参考方案1】:

另一种选择是:

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

【讨论】:

你可以为多个值做这件事吗?我的意思是增加一个以上的值 没有循环?由于dict 没有提供在单个表达式中访问多个元素的方法,我不知道如何。 使用循环就像 OP 在他的问题中写的那样,但每个键增加两个值而不是一个 我认为你应该为此提出一个新问题。【参考方案2】:

您有很多选择。我喜欢使用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)

【讨论】:

对于lambda: 0,你可以直接说int @hughdbrown:谢谢,我从来不知道。 @hughdbrown 如果没有您的评论,我永远不会理解 defaultdict 在做什么。谢谢。 很遗憾文档没有提到Counter也支持默认的0功能。到目前为止,我一直在使用 Nicola 的解决方案,但没有它会更好。【参考方案3】:

你想要的叫做默认字典

见http://docs.python.org/library/collections.html#collections.defaultdict

【讨论】:

【参考方案4】:

变换:

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

使用setdefault

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

【讨论】:

【参考方案5】:

还有一点点不一样的setdefault方式:

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

如果结合其他逻辑可能会有一些优势。

【讨论】:

【参考方案6】:

.get.setdefault 中的任何一个都可以使用:

.get()如果没有有效的键,则在函数中传递默认值

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

.setdefault ()创建一个传递默认值的键

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

【讨论】:

以上是关于Python字典增量的主要内容,如果未能解决你的问题,请参考以下文章

《流畅的python》学习笔记及书评

《流畅的python》学习笔记及书评

python小脚本Yaml配置文件动态加载

python小脚本Yaml配置文件动态加载

python-字典

python3字典遍历