理解map/reduce/filter/lambda管道函数,实现课程成绩更新
用map/reduce/filter/lambda实现课程成绩更新函数
需求说明
我搞不懂map、reduce、filter、lambda这些函数,现在需要实现一个满足以下要求的函数:
- 接收两个序列参数:
- 第一个序列元素格式为
(课程名, 成绩列表) - 第二个序列元素格式为
(课程名, 加分因子)
- 第一个序列元素格式为
- 仅为第二个序列中存在的课程,在其平均分基础上加上对应的加分因子
- 返回更新后的课程平均分序列,禁止使用循环,必须用map、reduce、filter和lambda实现
示例
输入:
courses = (('a', [81, 78, 57]), ('b', [95, 98]), ('c', [75, 45]), ('d', [58])) factors = (('c', 15), ('a', 20))
预期输出:
(('a', 92.0), ('b', 96.5), ('c', 75.0), ('d', 58.0))
已实现的平均分计算函数
我已经写出了计算各课程平均分的代码:
def avg_grades(courses): def calcAVG(courseGrades): return sum(courseGrades) / len(courseGrades) # 计算单门课程的平均分 coursesGrades = tuple(map(lambda course: (course[0], calcAVG(course[1])), courses)) return coursesGrades
完整实现方案
结合你的已有代码,我们可以通过reduce构建加分因子字典,再用map完成成绩更新,完整代码如下:
from functools import reduce def update_course_grades(courses, factors): # 复用你的逻辑计算原始平均分 def calcAVG(courseGrades): return sum(courseGrades) / len(courseGrades) original_avgs = tuple(map(lambda course: (course[0], calcAVG(course[1])), courses)) # 用reduce将factors序列转为字典,快速查询加分因子 factor_dict = reduce(lambda acc, item: {**acc, item[0]: item[1]}, factors, {}) # 用map遍历原始平均分,对符合条件的课程加分 updated_avgs = tuple(map( lambda avg: (avg[0], avg[1] + factor_dict.get(avg[0], 0)), original_avgs )) return updated_avgs # 测试示例 courses = (('a', [81, 78, 57]), ('b', [95, 98]), ('c', [75, 45]), ('d', [58])) factors = (('c', 15), ('a', 20)) print(update_course_grades(courses, factors))
代码逻辑解释
- 计算原始平均分:用
map遍历每个课程元组,调用calcAVG计算平均分,生成包含课程名和对应平均分的序列。 - 构建加分字典:通过
reduce迭代factors序列,每次将当前课程的加分因子合并到累加字典中,最终得到一个可快速查询的键值对结构。 - 更新成绩:再次用
map遍历原始平均分序列,对每个课程,通过字典的get方法获取加分因子(不存在则加0),完成成绩更新。
内容的提问来源于stack exchange,提问作者Or Yona
相关产品推荐
相关产品推荐

