仅当新成绩更高时更新学生课程字典的代码实现问题
问题分析与修复方案
原代码存在的核心问题
- 键存在性检查顺序错误:先执行
courses = students[name_student],如果学生不在字典中会直接抛出KeyError,后续的存在性判断根本无法执行。 - 元组不可变导致修改失败:试图直接修改元组的第二个元素
courses[i][1] = grade,但元组是不可变类型,这行代码会触发TypeError。 - 新课程添加逻辑错误:在循环内部用
elif course_name not in courses[i][0]判断,会导致只要第一个课程不匹配就直接添加新课程,无法遍历完所有已修课程确认是否重复。 - 成绩比较精度丢失:用
int()转换成绩后再比较,会丢失小数部分精度,比如7.9会被当成7,导致错误的成绩替换判断。 - 数据类型不一致:用字符串
"no completed courses"标记无课程状态,和后续的列表类型混杂,增加逻辑复杂度。
修正后的代码实现
def add_course(students: dict, name_student: str, course_info: tuple[str, float]): course_name, new_grade = course_info # 先检查学生是否存在 if name_student not in students: return "Student not in the database" student_courses = students[name_student] # 初始化课程列表(兼容原初始状态) if student_courses == "no completed courses": students[name_student] = [course_info] return # 遍历已修课程,检查是否存在同名课程 course_found = False for idx, (existing_course, existing_grade) in enumerate(student_courses): if existing_course == course_name: course_found = True # 仅当新成绩更高时替换,直接比较float类型 if new_grade > existing_grade: # 元组不可变,替换整个元组 student_courses[idx] = (course_name, new_grade) # 找到课程后直接退出循环 break # 遍历完未找到同名课程,添加新课程 if not course_found: student_courses.append(course_info) def print_student(students: dict, name_student: str): if name_student not in students: print("Student not in the database") return courses = students[name_student] if not courses or courses == "no completed courses": print(f"{name_student} has no completed courses") return print(f"{name_student}:") for course, grade in courses: print(f" {course}: {grade}") if __name__ == "__main__": students = {"Peter": "no completed courses"} add_course(students, "Peter", ("Introduction to Programming", 5)) add_course(students, "Peter", ("Advanced Programming", 7)) add_course(students, "Peter", ("Advanced Programming", 5)) print_student(students, "Peter")
关键优化点说明
- 调整键检查顺序:先判断学生是否在字典中,避免提前访问不存在的键导致报错。
- 处理元组不可变问题:通过替换整个元组的方式更新成绩,而非修改元组元素。
- 修正新课程添加逻辑:遍历所有课程确认无同名课程后再执行添加,避免重复添加或提前终止遍历。
- 保留成绩精度:直接比较原始float类型成绩,不做int转换。
- 简化状态兼容:保留原初始状态的同时,后续统一转为列表处理,也可直接将初始状态设为空列表
[]进一步简化逻辑。
内容的提问来源于stack exchange,提问作者Meneguim Lucas
相关产品推荐
相关产品推荐

