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

仅当新成绩更高时更新学生课程字典的代码实现问题

问题分析与修复方案

原代码存在的核心问题

  • 键存在性检查顺序错误:先执行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")

关键优化点说明

  1. 调整键检查顺序:先判断学生是否在字典中,避免提前访问不存在的键导致报错。
  2. 处理元组不可变问题:通过替换整个元组的方式更新成绩,而非修改元组元素。
  3. 修正新课程添加逻辑:遍历所有课程确认无同名课程后再执行添加,避免重复添加或提前终止遍历。
  4. 保留成绩精度:直接比较原始float类型成绩,不做int转换。
  5. 简化状态兼容:保留原初始状态的同时,后续统一转为列表处理,也可直接将初始状态设为空列表[]进一步简化逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 14:23:16