如何用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:]}
之所以只保留了每个学生的最后一个分数,核心原因有两个:
- 循环顺序错误:你先遍历作业名称,再遍历学生,最后遍历分数,这会导致每个学生的子字典被反复覆盖
- 子字典每次仅生成单个键值对:每次循环
{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
相关产品推荐
相关产品推荐

