使用for循环遍历嵌套字典

时间:2019-01-21 19:40:18

标签: python dictionary

我是python新手,正在学习字典。我有一个清单,列出了他们的成绩,我需要将每个学生映射到他的成绩以进行特定的考试。

我正在使用for循环遍历每个学生的姓名,然后使用另一个循环遍历考试成绩。我的代码在下面,但是由于某种原因我没有得到理想的结果。我希望有人能指出我搞砸的地方。谢谢。

students = {'Student1': {'Exam1': 80, 'Exam2': 80, 'Exam3': 70},
      'Student2': {'Exam1': 90, 'Exam2': 70, 'Exam3': 65}}

student_grades = {}
for student, exam in students.items():
    student_grades = {student}
    for key,value in exam.items():
       student_grades.update({key + ':', value})

print(student_grades)


#This is what I'd like my result to look like:
({'Student1': {'Exam1': 80}}, {'Student1': {'Exam2': 80}},   {'Student1': {'Exam3': 70}}, {'Student2': {'Exam1': 90}}, {'Student2':   {'Exam2': 70}}, {'Student2': {'Exam2': 65}})

#But this is what it actually looks like:
{65, 'Student2', 90, 70, 'Exam3:', 'Exam1:', 'Exam2:'}

1 个答案:

答案 0 :(得分:2)

您可以在字典上使用for循环以仅通过键进行迭代。同样,看来您最终想要的是一个装满小词典的元组。因此,通过将student_grades设置为空括号使它成为Python元组;将其设置为大括号{}的方式使其成为一个空的Python字典或设置。

students = {'Student1': {'Exam1': 80, 'Exam2': 80, 'Exam3': 70},
      'Student2': {'Exam1': 90, 'Exam2': 70, 'Exam3': 65}}

student_grades = ()

# Loop through the students, then for each one loop through the exams
for student in students:
    for exam in students[student]:
        # Now make a new entry for student_grades, then add this entry
        new_dict = {student: {exam: students[student][exam] }}
        student_grades += (new_dict,)

print(student_grades)

在这种情况下,相对于元组([]),我个人更喜欢列表(())。 Python可以让您动态进行元素内的循环。因此,这是一种通过单个命令将所有内容都放在一个列表中的方法。

as_a_list = [ {student: {exam: students[student][exam]}} for student in students for exam in students[student] ]
print(as_a_list)

编辑(在评论中回答问题):我不确定“空列表作为字典”是什么意思。在Python中,列表和字典是两件事。在您原来的示例中,“这是我希望结果看起来像:”之后,您有一个元组,而不是字典(也没有列表)。请注意,整个内容用括号括起来,而不是大括号。如果您也想将student_grades用作字典,那么下一个问题就是您希望它的键是什么。如果您希望他们成为学生的名字,那么您希望它与最初的字典student有什么不同吗?