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

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

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

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

【问题讨论】:

  • 你可以对两个值做同样的事情吗?

标签: python dictionary increment


【解决方案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】:

【讨论】:

    【解决方案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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-10-19
          • 1970-01-01
          • 2021-05-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多