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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 23:03:23