首页 > 解决方案 > 我该如何解决这个“ValueError:没有足够的值来解包(预期为 3,得到 2)”?

问题描述

请帮我完成我的任务!

我的目标是用户可以选择他/她想在某个科目中看到的成绩。输出应该是这样的:

Name: Mary , Math Grade: 98

这是我到目前为止所拥有的:

N = int(input("Please enter number of students: "))

while (N < 2 or N > 10):
    N = int(input("Please only enter 2 - 10 students: "))

name = []
math_grade = []
science_grade = []

while (N != 0):
    name.append(input('Enter name:'))
    math_grade.append(input('Enter grade in math:'))
    science_grade.append(input('Enter grade in science:'))
    N = N - 1

record = []    
record.append(name)
record.append(math_grade)
record.append(science_grade)

Class_Record = {}

for name, math_grade, science_grade in record:
    Class_Record[name] = {"name": name, "math grade": math_grade, "science grade": science_grade }

那时我不断收到价值错误。我也不知道如何打印它以获得我想要的东西。

如果您能帮我修复错误并告诉我如何打印所需的输出,我将不胜感激!!!

标签: pythonpython-3.x

解决方案


问题是您如何组织record列表。

这行代码期望中的每个项目record都是一个包含三个项目的子列表:姓名、数学成绩和科学成绩。

for name, math_grade, science_grade in record

所以它期望record是这样的:

record = [
    ["Jim", "B", "C"],
    ["Mary", "A", "B"],
]

但相反,你做record了一个名字的子列表,然后是数学成绩的子列表,然后是科学成绩的子列表:

record = [
    ["Jim", "Mary"],
    ["B", "A"],
    ["C", "B"]
]

因此,当代码将第一项拉入 时record,它是一个只有两项的列表,您告诉它期望三个。(如果你有三个学生,代码会“工作”,但不是你想要的方式。)

所以你要么必须改变你把东西放进record去的方式来匹配你把它们拉出来的方式,要么改变你把它们拉出来的方式。

实际上,它似乎record只是一个临时变量,仅用于构建Class_Record. 如果这是真的,您可以直接构建Class_Record

Class_Record = {}

while (N != 0):
    name = input('Enter name:')
    math_grade = input('Enter grade in math:')
    science_grade = input('Enter grade in science:')
    Class_Record[name] = {'math_grade': math_grade, 'science_grade': science_grade)
    N = N - 1

推荐阅读