You need to enable JavaScript to run this app. Python嵌套字典存储学生课程信息时出现键值覆盖、仅留最后输入记录
优惠活动
大模型
产品
解决方案
定价
更多

Python嵌套字典存储学生课程信息时出现键值覆盖、仅留最后输入记录

嵌套字典存储异常修正

核心问题定位

  • 核心错误点:代码将studentDictionary = defaultdict(dict)的初始化语句写在了while循环内部,每轮循环都会直接重置字典为全新的空实例,上一轮存储的所有学生数据都会被清空,最终仅保留最后一次输入的学生信息。
  • 冗余定义了未被使用的courseDictionary变量,无实际作用。
  • 原有输入提示文案和预期交互流程不匹配。

修正方案逻辑

  • 将studentDictionary的初始化操作移到while循环外部,仅在程序启动时创建一次字典,后续循环仅往该实例中追加、更新学生数据,不重复创建对象。
  • 对齐交互示例的输入提示文案,保证操作流程和预期一致。
  • 若不依赖defaultdict,也可使用普通字典实现:每次输入学生ID后,先判断该ID是否已在字典键中,不存在则先初始化为空课程字典,避免键不存在的报错。

可运行代码(defaultdict版本)

from collections import defaultdict

inp = "Y"
# 仅在程序启动时初始化一次,不放入循环内
studentDictionary = defaultdict(dict)

while inp != "N":
    studentId = int(input("Enter ID: "))
    numberCourses = int(input("Enter Course number: "))

    for _ in range(numberCourses):
        courseName, ects, grade = input("Enter course, weight, grade: ").split()
        ects = int(ects)
        studentDictionary[studentId].update({courseName: (ects, grade)})

    inp = input("Continue? ")

# 转为普通字典输出,避免defaultdict类型前缀
print(dict(studentDictionary))

可运行代码(普通字典版本,无需导入依赖)

inp = "Y"
studentDictionary = {}

while inp != "N":
    studentId = int(input("Enter ID: "))
    # 若学生ID不存在则先初始化空课程字典
    if studentId not in studentDictionary:
        studentDictionary[studentId] = {}
    numberCourses = int(input("Enter Course number: "))

    for _ in range(numberCourses):
        courseName, ects, grade = input("Enter course, weight, grade: ").split()
        ects = int(ects)
        studentDictionary[studentId].update({courseName: (ects, grade)})

    inp = input("Continue? ")

print(studentDictionary)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.12 07:54:01