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

Python MOOC学生数据库练习:add_course函数重复课程成绩处理问题求助

问题:学生数据库中重复添加课程时无法保留最高成绩

作为Python新手,在完成「学生数据库练习-第三部分」时遇到问题:编写的add_course函数无法忽略添加成绩更低的重复课程,运行代码后会产生重复课程条目。期望实现:若学生已存在某课程,重复添加时仅保留最高成绩,不降低原有记录。

原代码核心问题

原代码中elif course[0] in courses:的判断逻辑错误。courses是存储(课程名, 成绩)元组的列表,直接用课程名字符串判断是否在列表中,永远会返回False,导致重复课程被不断添加。

修改后的解决方案

修正后的add_course函数

def add_course(database: dict, name: str, course: tuple):
    courses = database[name]
    course_name, new_grade = course
    # 跳过成绩为0的课程
    if new_grade == 0:
        return
    # 遍历现有课程,检查是否存在同名课程
    for i, (existing_name, existing_grade) in enumerate(courses):
        if existing_name == course_name:
            # 仅当新成绩更高时更新原有记录
            if new_grade > existing_grade:
                courses[i] = course
            return
    # 未找到同名课程,添加新条目
    courses.append(course)

完整运行代码

# Write your solution here
def add_student(database: dict, name: str):
    courses = []
    database[name] = courses

def add_course(database: dict, name: str, course: tuple):
    courses = database[name]
    course_name, new_grade = course
    if new_grade == 0:
        return
    for i, (existing_name, existing_grade) in enumerate(courses):
        if existing_name == course_name:
            if new_grade > existing_grade:
                courses[i] = course
            return
    courses.append(course)
    
def print_student(database: dict, name: str):
    if name not in database:
        print(f"{name}: no such person in the database")
    else:
        courses = database[name]
        if len(courses) == 0:
            print(f"{name}:")
            print(" no completed courses")
        else:
            sum_grades = 0
            print(f"{name}:")
            print(f" {len(courses)} completed courses:")
            for course_name, grade in courses:
                sum_grades += grade
                print(f"  {course_name} {grade}")
            avg_grade = sum_grades / len(courses)
            print(f" average grade {avg_grade}")

if __name__ == "__main__":
    students = {}
    add_student(students, "Peter")
    add_course(students, "Peter", ("Introduction to Programming", 3))
    add_course(students, "Peter", ("Advanced Course in Programming", 2))
    add_course(students, "Peter", ("Data Structures and Algorithms", 0))
    add_course(students, "Peter", ("Introduction to Programming", 2))
    print_student(students, "Peter")

关键改动说明

  1. 拆分课程元组为单独的名称和成绩变量,提升逻辑可读性;
  2. 使用enumerate遍历课程列表,同时获取索引和课程信息,方便后续更新原有记录;
  3. 找到同名课程时,仅在新成绩更高的情况下替换原有条目;
  4. 对print_student函数做了小优化:提前取出课程列表变量,将平均成绩计算移至循环外(避免冗余计算)。

运行结果

运行代码后,不会出现重复课程条目,且保留最高成绩,输出如下:

Peter:
 2 completed courses:
  Introduction to Programming 3
  Advanced Course in Programming 2
 average grade 2.5

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 12:40:24