You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 21:18:21