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

Python遍历字典keys、values打印不及格学生报ValueError如何解决?

报错原因
  • 核心报错是你遍历students.values()的时候,每个返回值是单个学生的全科目成绩字典,无法直接拆成course, grade两个变量,所以触发ValueError: too many values to unpack (expected 2)
  • 额外的问题:代码缺少必要缩进,成绩保存为字符串类型无法直接和数字4比较,遍历逻辑混乱(取到学生姓名后又遍历了所有学生的成绩,没有对应到当前学生)
修复后的完整代码
students = {('Ozols', 'Jānis'): {'Math': '10', 'ProgVal': '5', 'Sports': '5'},
        ('Krumiņa', 'Ilze'): {'Math': '7', 'ProgVal': '3', 'Sports': '6'},
        ('Liepa', 'Peteris'): {'Math': '3', 'ProgVal': '7', 'Sports': '7'},
        ('Lapsa', 'Maris'): {'Math': '10', 'ProgVal': '10', 'Sports': '3'}}

courses = ['Math', 'ProgVal', 'Sports']


def fail():
    # 同时遍历学生姓名元组和对应的成绩字典
    for (lName, fName), score_dict in students.items():
        # 遍历当前学生的每门课程成绩
        for course, grade_str in score_dict.items():
            # 把字符串类型的成绩转为整数
            grade = int(grade_str)
            if grade < 4:
                print(fName, lName)
                # 只要有一门不及格就打印,跳出循环避免重复打印同一个学生
                break


while True:
    print()
    command = input("command:> ")
    command = command.lower()

    if command == 'fail':
        fail()
    elif command == 'done':
        break
print("DONE")
运行效果

输入fail命令后会输出所有至少有一门成绩低于4分的学生:

Ilze Krumiņa
Peteris Liepa
Maris Lapsa

如果需要同时输出不及格的课程,删掉break,把打印语句改成print(fName, lName, course, grade)即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 14:54:03