【问题标题】:Merge dictionaries and add values合并字典并添加值
【发布时间】:2013-03-18 15:30:42
【问题描述】:

我有几个我想组合的字典,这样如果一个键在多个字典中,则将值相加。例如:

d1 = {1: 10, 2: 20, 3: 30}
d2 = {1: 1, 2: 2, 3: 3}
d3 = {0: 0}

merged = {1: 11, 2: 22, 3: 33, 0: 0}

在 Python 中执行此操作的最佳方法是什么?我在看 defaultdict 并试图想出一些东西。我正在使用 Python 2.6。

【问题讨论】:

  • 这些都不是真正的重复。
  • @Bakuriu:我认为这两者是不同的——第一个不做类似计数器的算术,第二个似乎不介意丢失零的键价值观。 (这实际上让我感到惊讶——直到今天我才知道Counter 对象在进行算术运算时会丢弃零值键。)
  • Here's 相关行。

标签: python


【解决方案1】:

使用defaultdict:

>>> d = defaultdict(int)
>>> for di in [d1,d2,d3]:
...   for k,v in di.items():
...     d[k] += v
...
>>> dict(d)
{0: 0, 1: 11, 2: 22, 3: 33}
>>>

【讨论】:

    【解决方案2】:

    拥有最丰富的python标准函数和库:

    dlst = [d1, d2, d3]
    for i in dlst:
        for x,y in i.items():
            n[x] = n.get(x, 0)+y
    

    代替使用if-else 检查,使用dict.get 和默认值0 简单易行。

    【讨论】:

    • 可能defaultdict 的使用要快一点,但 iw 会很小而且可以忽略不计。
    【解决方案3】:

    不导入任何东西。 .

    d4={}
    for d in [d1,d2,d3]:
        for k,v in d.items():
            d4.setdefault(k,0)
            d4[k]+=v
    print d4
    

    输出:

    {0: 0, 1: 11, 2: 22, 3: 33}
    

    【讨论】:

    • 还有Counter 已经按照OP想要的方式实现__add__
    • 我可以看到这样做的原因是允许 0:0 存在,但是由于 OP 有 python 2.6 它不会工作
    • 我已删除 Counter 并查看更新后的答案。 . 不导入任何东西。 .
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-19
    • 1970-01-01
    • 2022-07-05
    • 1970-01-01
    • 1970-01-01
    • 2018-07-26
    • 1970-01-01
    相关资源
    最近更新 更多