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
相关产品推荐
相关产品推荐

