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

如何用dict comprehension创建嵌套字典?列表转嵌套字典实现问题

如何用字典推导式将学生成绩列表转换为嵌套字典?

首先明确你的输入数据和目标需求:

输入数据

grades_lists = [
    ['Student', 'Test', 'Assignment', 'Exam'],
    ['Bella', '80', '90', '100'],
    ['Sam', '65', '75', '85'],
    ['Emily', '60', '75', '90'],
]

目标输出

生成一个嵌套字典,让学生姓名映射到包含各作业分数的子字典,比如grade_dicts['Bella']['Test']需等于80:

{
    'Bella': {'Test': 80, 'Assignment': 90, 'Exam': 100},
    'Sam': {'Test': 65, 'Assignment': 75, 'Exam': 85},
    'Emily': {'Test': 60, 'Assignment': 75, 'Exam': 90}
}

你的代码问题分析

你尝试的推导式:

grade_dicts = {x[0]:{y:z} for y in grades_lists[0][1:] for x in grades_lists[1:] for z in x[1:]}

之所以只保留了每个学生的最后一个分数,核心原因有两个:

  1. 循环顺序错误:你先遍历作业名称,再遍历学生,最后遍历分数,这会导致每个学生的子字典被反复覆盖
  2. 子字典每次仅生成单个键值对:每次循环{y:z}只会创建一个单键值对的字典,后续循环会直接替换之前的子字典,最终只保留最后一次循环的结果(也就是Exam对应的分数)

正确的字典推导式写法

我们需要先遍历每个学生,再为每个学生生成完整的子字典,用zip快速配对作业名称和分数(同时把分数转为整数)是最简洁的方式:

grade_dicts = {
    student[0]: dict(zip(grades_lists[0][1:], map(int, student[1:])))
    for student in grades_lists[1:]
}

代码解释:

  • for student in grades_lists[1:]:遍历除表头外的每一行(每个学生的成绩数据)
  • student[0]:作为外层字典的键(学生姓名)
  • zip(grades_lists[0][1:], map(int, student[1:])):把表头里的作业名称(grades_lists[0][1:])和当前学生的分数(通过map(int, ...)转为整数)一一配对成元组
  • dict(...):把配对后的元组转换为子字典

验证结果:

print(grade_dicts['Bella']['Test'])  # 输出 80
print(grade_dicts['Sam']['Assignment'])  # 输出 75

如果你更习惯用索引配对,也可以用嵌套字典推导式:

grade_dicts = {
    student[0]: {
        grades_lists[0][idx]: int(student[idx])
        for idx in range(1, len(student))
    }
    for student in grades_lists[1:]
}

这个写法通过遍历索引,将每个作业名称和对应位置的分数配对,效果和上面的一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:03:35