Python中对元组列表按首元素分组求和次元素的最优方法
优化实现方案
以下是几种基于Python内置包的高效实现方式,替代普通for循环:
1. 使用collections.defaultdict
这是最简洁高效的实现之一,无需额外排序操作:
from collections import defaultdict input_list = [('Skills', 3), ('Wholesome', 3), ('FanArt', 3), ('Clip', 3), ('Skills', 2), ('FanArt', 2)] sum_dict = defaultdict(int) for key, val in input_list: sum_dict[key] += val # 按需转为普通字典 sum_dict = dict(sum_dict) print(sum_dict)
输出:
{"Skills": 5, "Wholesome": 3, "FanArt": 5, "Clip": 3}
2. 使用itertools.groupby
需要先对列表按元组首元素排序,因为groupby仅会对连续的相同键分组:
from itertools import groupby input_list = [('Skills', 3), ('Wholesome', 3), ('FanArt', 3), ('Clip', 3), ('Skills', 2), ('FanArt', 2)] # 先按键排序 sorted_list = sorted(input_list, key=lambda x: x[0]) # 分组后计算每组的数值总和 sum_dict = { key: sum(val for _, val in group) for key, group in groupby(sorted_list, key=lambda x: x[0]) } print(sum_dict)
3. 使用collections.Counter
Counter是dict的子类,本身支持累加操作,代码更简洁:
from collections import Counter input_list = [('Skills', 3), ('Wholesome', 3), ('FanArt', 3), ('Clip', 3), ('Skills', 2), ('FanArt', 2)] sum_dict = Counter() for key, val in input_list: sum_dict[key] += val print(dict(sum_dict))
内容的提问来源于stack exchange,提问作者Ashfand Shaikh
相关产品推荐
相关产品推荐

