当净值不是正值时,将两个python词典合并为一个

时间:2015-02-21 13:25:20

标签: python dictionary

我有两个python词典,我试图将这些值加在一起。答案:Is there any pythonic way to combine two dicts (adding values for keys that appear in both)?让我大部分时间都可以。但是,我的情况是净值可能为零或负值,但我仍然想要最终字典中的值。即使计数器接受负值,它也只会输出一个大于零的值。

实施例

from collections import Counter   
A = Counter({'a': 1, 'b': 2, 'c': -3, 'e': 5, 'f': 5})
B = Counter({'b': 3, 'c': 4, 'd': 5, 'e': -5, 'f': -6})
C = A + B
print(C.items())

输出:[('a', 1), ('c', 1), ('b', 5), ('d', 5)]

c = -3 + 4 = 1是正确的,因此负输入不是问题,但输出中缺少e:0和f:-1

如何执行求和并获取所有值?

2 个答案:

答案 0 :(得分:9)

汇总值为0和更低,是,如记录所示:

  

提供了几个数学运算来组合Counter对象以生成多个集合(计数大于零的计数器)。加法和减法通过添加或减去相应元素的计数来组合计数器。交点和并集返回相应计数的最小值和最大值。每个操作都可以接受带有符号计数的输入,但输出将排除计数为零或更少的结果

     

[...]

     
      
  • multiset方法仅适用于具有正值的用例。输入可以是负数或零,但仅创建具有正值的输出。没有类型限制,但值类型需要支持加法,减法和比较。
  •   

如果您想将值保留为0或更低,则需要使用Counter.update()。由于这是就地操作,您必须在此处创建副本:

>>> from collections import Counter   
>>> A = Counter({'a': 1, 'b': 2, 'c': -3, 'e': 5, 'f': 5})
>>> B = Counter({'b': 3, 'c': 4, 'd': 5, 'e': -5, 'f': -6})
>>> C = A.copy()
>>> C.update(B)
>>> C
Counter({'b': 5, 'd': 5, 'a': 1, 'c': 1, 'e': 0, 'f': -1})

如果保留A不是目标,您可以直接更新它。

答案 1 :(得分:5)

如下:

dict((x, a.get(x, 0) + b.get(x, 0)) for x in set(a)|set(b))

示例:

>>> a = {'a':1, 'b':2, 'c':-3, 'e':5, 'f': 5}
>>> b = {'b':3, 'c':4, 'd':5, 'e':-5, 'f': -6}
>>>
>>> dict((x, a.get(x, 0) + b.get(x, 0)) for x in set(a)|set(b))
{'e': 0, 'a': 1, 'f': -1, 'd': 5, 'c': 1, 'b': 5}