【问题标题】:iterating over nested dictionary using for loop使用 for 循环遍历嵌套字典
【发布时间】:2019-01-21 19:40:17
【问题描述】:

我是 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:'}

【问题讨论】:

  • 集合和字典都使用花括号{},但它们是非常不同的东西。您要求更新学生成绩的方式实际上是在制作一个集合,其中一些字符串与: 连接。您不应该按字面意思输入该符号。您可能希望查看有关字典的基本教程
  • 你已经有了一个很好的紧凑格式的结果,为什么要为每个考试创建单独的字典?

标签: python dictionary


【解决方案1】:

您可以在字典上使用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 可以让你在运行中的元素中执行 for 循环。因此,这是一种使用单个命令将所有内容放在一个列表中的方法。

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

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

【讨论】:

  • 非常感谢您的回复和解释。唯一的问题是最终结果应该是字典而不是列表。有没有办法将一个初始的空列表 student_gardes 作为字典并对其进行迭代?
猜你喜欢
  • 1970-01-01
  • 2021-04-13
  • 2013-02-20
  • 2011-03-18
  • 2021-11-20
  • 1970-01-01
相关资源
最近更新 更多