如何用Python的zip、lambda实现Group by分组求和?
分组求和处理姓名与分数数据
原始数据
假设我们有两组数据names和marks,对应关系如下:
Names Marks Sriyam [10] Epali [10] Sriyam [12,13] Rajendra [10] Shankar [10] Epali [13,14]
需求
按姓名分组,将每个姓名对应的所有分数求和后合并为单个列表值,最终每个姓名仅出现一次,结果如下:
names marks Sriyam [35] Epali [37] Rajendra [10] Shankar [10]
实现步骤(使用groupby、lambda、zip)
1. 数据配对与排序
先用zip把姓名和对应分数列表一一配对,再按姓名排序——因为itertools.groupby仅对连续相同的键分组,排序能确保同一姓名的记录聚在一起。
2. 分组求和
以姓名为分组键,用lambda表达式遍历分组内的所有分数列表,把其中的数字全部求和,最后将总和包装成列表格式。
完整代码
from itertools import groupby # 原始数据 names = ["Sriyam", "Epali", "Sriyam", "Rajendra", "Shankar", "Epali"] marks = [[10], [10], [12,13], [10], [10], [13,14]] # 配对并按姓名排序 paired_sorted = sorted(zip(names, marks), key=lambda x: x[0]) # 分组计算求和结果 result = [] for name, group in groupby(paired_sorted, key=lambda x: x[0]): total_score = sum(num for sublist in (item[1] for item in group) for num in sublist) result.append((name, [total_score])) # 输出格式化结果 print("names marks") for name, score in result: print(f"{name:<10} {score}")
代码细节说明
zip(names, marks):生成(姓名, 分数列表)的元组序列,比如("Sriyam", [10])。sorted(..., key=lambda x: x[0]):按姓名对配对后的元组排序,保证同姓名记录连续。groupby(..., key=lambda x: x[0]):以姓名为键分组,将同姓名的所有记录归为一组。- 嵌套生成器
sum(num for sublist in ... for num in sublist):遍历分组内的每个分数列表,再提取列表中的每个数字求和,最后转成[总和]的格式。
内容的提问来源于stack exchange,提问作者sriyam
相关产品推荐
相关产品推荐

