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")
关键改动说明
- 拆分课程元组为单独的名称和成绩变量,提升逻辑可读性;
- 使用
enumerate遍历课程列表,同时获取索引和课程信息,方便后续更新原有记录; - 找到同名课程时,仅在新成绩更高的情况下替换原有条目;
- 对
print_student函数做了小优化:提前取出课程列表变量,将平均成绩计算移至循环外(避免冗余计算)。
运行结果
运行代码后,不会出现重复课程条目,且保留最高成绩,输出如下:
Peter: 2 completed courses: Introduction to Programming 3 Advanced Course in Programming 2 average grade 2.5
内容的提问来源于stack exchange,提问作者Antoniorodr
相关产品推荐
相关产品推荐

