1 python dictionary list-comprehension list
我正在尝试使用对列表列表的字典理解来创建字典字典。
列表列表包含学生姓名、作业名称和成绩。例如,数据可能如下所示:
grades_lists = [
['Student', 'Test', 'Assignment', 'Exam'],
['Bella', '80', '90', '100'],
['Sam', '65', '75', '85'],
['Emily', '60', '75', '90'],
]
Run Code Online (Sandbox Code Playgroud)
我想创建一个字典,将学生姓名映射到包含作业名称和成绩的字典。例如:
grades_dicts['Bella']['Test'] == 80
Run Code Online (Sandbox Code Playgroud)
我想要的字典是这样的:
{
'Bella': {'Test': 80, 'Assignment': 90, 'Exam': 100},
'Sam': {'Test': 65, 'Assignment': 75, 'Exam': 85},
'Emily': {'Test': 60, 'Assignment': 75, 'Exam': 90}
}
Run Code Online (Sandbox Code Playgroud)
所以每一行都grades_list变成了一本字典;第一列是学生的姓名,其他列是字典中的值,其键取自 的第一行grades_list。
我一直在尝试使用 dict comprehension 在字典中生成相应的键和值。像这样的东西:
grade_dicts = {x[0]:{y:z} for y in grades_lists[0][1:] for x in grades_lists[1:] for z in x[1:]}
Run Code Online (Sandbox Code Playgroud)
但这并不能正确生成所有成绩:
{
'Bella': {'Exam': '100'},
'Emily': {'Exam': '90'},
'Sam': {'Exam': '85'}
}
Run Code Online (Sandbox Code Playgroud)
你把嵌套搞混了。以下工作:
{name: {col: int(value) for col, value in zip(grades_list[0][1:], row)}
for name, *row in grades_list[1:]}
Run Code Online (Sandbox Code Playgroud)
该for name, *row in ...循环花费的每一行,并提取只是第一个值进入name,其余为row(在*告诉Python来取余)。这让您随后可以将该行与第一行中的列名一起使用来创建嵌套字典。
通过使用常规循环,通常更容易了解推导式的作用。您的代码执行以下操作:
grade_dicts = {}
for y in grades_lists[0][1:]:
for x in grades_lists[1:]:
for z in x[1:]:
grade_dicts[x[0]] = {y:z}
Run Code Online (Sandbox Code Playgroud)
循环太多了,你最终会x[0]多次设置一个值;len(x[1:])事实上倍。只剩下最后一{y: z}本字典了。
我的版本是这样做的:
grade_dicts = {}
for name, *row in grades_list[1:]:
inner = {}
for col, value in zip(grades_list[0][1:], row):
inner[col] = int(value)
grade_dicts[name] = inner
Run Code Online (Sandbox Code Playgroud)
这只是两个循环,其中内部为每列生成一个单独的字典。我曾经zip()将标签和值配对。