如何在Python 3.7中合并字典并对相同键的值求和?
如何在Python 3.7中合并字典并对相同键的值求和?
嘿,我完全懂你遇到的困扰——直接用字典解包合并的话,重复的键会被后面的覆盖,根本达不到求和的效果对吧?别发愁,这里有几种实用的方法能帮你实现需求,咱们一个个来看:
方法一:手动遍历(最直观,适合理解逻辑)
这种方法就是一步步遍历所有字典的键值对,判断键是否已经存在于结果字典中,存在就累加值,不存在就直接赋值,逻辑非常清晰:
d1 = {1: 1.1, 2: 2.2} d2 = {1: 3.3, 4: 5.5} final_dict = {} # 遍历所有要合并的字典 for current_dict in [d1, d2]: # 遍历当前字典的每个键值对 for key, value in current_dict.items(): if key in final_dict: final_dict[key] += value else: final_dict[key] = value print(final_dict) # 输出: {1: 4.4, 2: 2.2, 4: 5.5}
方法二:使用collections.defaultdict(更简洁的写法)
借助collections模块里的defaultdict,我们可以省去判断键是否存在的步骤,它会自动为不存在的键设置默认值(这里我们用float,默认就是0.0):
from collections import defaultdict d1 = {1: 1.1, 2: 2.2} d2 = {1: 3.3, 4: 5.5} final_dict = defaultdict(float) for current_dict in [d1, d2]: for key, value in current_dict.items(): final_dict[key] += value # 如果需要转换成普通字典(可选,defaultdict本身也能像普通字典一样用) final_dict = dict(final_dict) print(final_dict) # 输出: {1: 4.4, 2: 2.2, 4: 5.5}
方法三:使用collections.Counter(适合数值类型的快速求和)
Counter本来是用来统计元素出现次数的,但它也支持数值的加法操作,刚好适合咱们的场景,而且代码更短:
from collections import Counter d1 = {1: 1.1, 2: 2.2} d2 = {1: 3.3, 4: 5.5} # 把字典转换成Counter对象 counter1 = Counter(d1) counter2 = Counter(d2) # 直接相加就会自动对相同键的值求和 final_counter = counter1 + counter2 # 再转回普通字典 final_dict = dict(final_counter) print(final_dict) # 输出: {1: 4.4, 2: 2.2, 4: 5.5}
顺便说下你之前尝试的方法为什么不行:dict([*d1.items(), *d2.items()])是把两个字典的键值对都打包成一个列表,然后转换成字典。但字典的键是唯一的,后面出现的相同键会直接覆盖前面的,所以最终只会保留每个键最后一次出现的值,而不是求和。
备注:内容来源于stack exchange,提问作者24n8
相关产品推荐
相关产品推荐

