Python嵌套字典创建问题:代码输出不符合预期如何解决?
问题:无法生成预期的嵌套学生成绩字典
尝试将学生成绩数据整理为嵌套字典(学号为外层键,课程-成绩为内层键值对),但运行代码后仅保留了每个学号的最后一条记录,无法得到完整的成绩信息。
原代码
def stud(data): empty_dic = {} for line in data: empty_dic[line["stud_num"]]={line[course]:line[marks]} return empty_dic data = [ { "course": "asd", "stud_num": "123", "marks": 28 }, { "course": "qrt", "stud_num": "123", "marks": 27 }, { "course": "asd", "stud_num": "124", "marks": 30 }, { "course": "zx", "stud_num": "124", "marks": 31 }, { "course": "zx", "stud_num": "123", "marks": 28 } ]
当前输出
{"123":{"zx":28},"124":{"zx":31}}
期望输出
{"123":{"asd":28,"qrt":27,"zx":28},"124":{"asd":30,"zx":31}}
问题原因
原代码中,每次遍历数据时都会直接给empty_dic[line["stud_num"]]赋值一个新的字典,这会覆盖该学号之前已存储的成绩数据,最终仅保留最后一条记录。
解决方案
方法1:手动判断并更新内层字典
修改循环逻辑,先检查学号是否已存在于外层字典中,不存在则初始化空字典,再将当前课程和成绩添加到内层字典中:
def stud(data): empty_dic = {} for line in data: stud_num = line["stud_num"] course = line["course"] marks = line["marks"] # 若学号不存在,先创建空字典 if stud_num not in empty_dic: empty_dic[stud_num] = {} # 往对应学号的字典中添加课程成绩 empty_dic[stud_num][course] = marks return empty_dic # 测试调用 result = stud(data) print(result)
方法2:使用collections.defaultdict简化代码
借助defaultdict可以自动为不存在的键初始化空字典,代码更简洁:
from collections import defaultdict def stud(data): empty_dic = defaultdict(dict) for line in data: stud_num = line["stud_num"] empty_dic[stud_num][line["course"]] = line["marks"] # 如需转为普通字典,可使用dict(empty_dic) return dict(empty_dic) # 测试调用 result = stud(data) print(result)
运行结果
两种方法均可得到期望的嵌套字典:
{'123': {'asd': 28, 'qrt': 27, 'zx': 28}, '124': {'asd': 30, 'zx': 31}}
内容的提问来源于stack exchange,提问作者Ejaz
相关产品推荐
相关产品推荐

