我有两个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
如何执行求和并获取所有值?
答案 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}