Python合并两列表为字典时如何实现重复键值累加
问题描述
需求是将两个列表(一个存储字符串作为字典键,一个存储整数作为字典值)合并为字典,重复键对应的数值需要执行累加求和。
测试用例信息:
- 键列表:
stringlist = ["EL1", "EL2", "EL1", "EL3", "El4"] - 值列表:
integerlist = [1, 2, 12, 4, 5] - 预期结果:键
EL1对应值为13,即该键匹配到的1和12累加的结果
原有实现代码如下:
resultdictionary = {} for key in appfinal: for value in amountfinal: resultdictionary[key] = value amountfinal.remove(value) break
该逻辑遇到重复键会直接覆盖旧值,最终EL1只会保留最后一次匹配到的12,不符合累加要求,且遍历过程中修改原列表容易引发元素匹配错乱。
正确实现方法
基础原生写法(无需引入额外库)
直接通过zip同步配对两个列表同位置的键和值,遍历过程中判断键是否已存在:存在则在原有值基础上累加,不存在则初始化赋值。
stringlist = ["EL1", "EL2", "EL1", "EL3", "El4"] integerlist = [1, 2, 12, 4, 5] resultdictionary = {} for key, val in zip(stringlist, integerlist): if key in resultdictionary: resultdictionary[key] += val else: resultdictionary[key] = val
运行后得到的结果为{'EL1': 13, 'EL2': 2, 'EL3': 4, 'El4': 5},完全符合预期。
简化写法(借助collections模块)
使用defaultdict可以省去手动判断键是否存在的步骤,代码更简洁:
from collections import defaultdict stringlist = ["EL1", "EL2", "EL1", "EL3", "El4"] integerlist = [1, 2, 12, 4, 5] resultdictionary = defaultdict(int) for key, val in zip(stringlist, integerlist): resultdictionary[key] += val # 需要普通字典类型时直接强转即可 resultdictionary = dict(resultdictionary)
注意事项:
zip会按位置一一配对两个列表的元素,若两个列表长度不一致,会以较短的列表长度为准截断配对。原有嵌套循环+遍历中修改原列表的写法时间复杂度为O(n²),还容易出现元素漏匹配问题,不建议使用。
内容的提问来源于stack exchange,提问作者nsnro
相关产品推荐
相关产品推荐

