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

理解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))

代码逻辑解释

  1. 计算原始平均分:用map遍历每个课程元组,调用calcAVG计算平均分,生成包含课程名和对应平均分的序列。
  2. 构建加分字典:通过reduce迭代factors序列,每次将当前课程的加分因子合并到累加字典中,最终得到一个可快速查询的键值对结构。
  3. 更新成绩:再次用map遍历原始平均分序列,对每个课程,通过字典的get方法获取加分因子(不存在则加0),完成成绩更新。

内容的提问来源于stack exchange,提问作者Or Yona

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 14:05:08