合并两个具有相同键值的字典列表,如果找不到键,则仍添加值

时间:2020-04-11 07:17:35

标签: python python-3.x list dictionary

发票

[{'A': 5, 'B': 10, 'C': 15}, {'A': 5, 'B': 25, 'C': 17, 'D': 30, }]

银行

[{'A': 5, 'G': 10, 'Q': 15}, {'A': 5, 'B': 25, 'M': 17, 'T': 30, }]

合并后

答案

[{'A':10,'B':10,'C':15,'G':10,'Q':15},{'A':10,'B':50,'C':17,'D':30,'M':17,'T':30}]

1 个答案:

答案 0 :(得分:1)

尝试使用collections.Counter合并根据zip创建的两个配对字典之间的计数:

from collections import Counter

l1 = [{'A': 5, 'B': 10, 'C': 15}, {'A': 5, 'B': 25, 'C': 17, 'D': 30, }]

l2 = [{'A': 5, 'G': 10, 'Q': 15}, {'A': 5, 'B': 25, 'M': 17, 'T': 30, }]

result = [Counter(x) + Counter(y) for x, y in zip(l1, l2)]

print(result)

输出:

[Counter({'C': 15, 'Q': 15, 'A': 10, 'B': 10, 'G': 10}), Counter({'B': 50, 'D': 30, 'T': 30, 'C': 17, 'M': 17, 'A': 10})]

Counterdict的子类,因此您可以将其视为普通字典。如果您希望结果看起来像dict,则可以将其强制转换为[{'A': 10, 'B': 10, 'C': 15, 'G': 10, 'Q': 15}, {'A': 10, 'B': 50, 'C': 17, 'D': 30, 'M': 17, 'T': 30}]

为什么以上所述在docs中有效:

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