Python ValueError: too many values to unpack (expected 2) Python错误:值太多,无法拆分为两个变量

5

输入

 2 4
 1 2 3 4
 1 0
 2 1
 2 3  

我需要从第三行到末尾提取数字对(仅从第三行提取2个数字)
这是我的函数

def read_nodes():
    n, r = map(int, input().split())
    n_list = []

    for i in range(2 , n):
        n1, n2 = map(int, input().split())
        n_list.append([n1, n2])
    return n_list
print(read_nodes())

我期望的输入是[[1,0],[2,1],[2,3]] 但是提示 ValueError: too many values to unpack (expected 2)


输入是一个矩阵吗? - khelili miliana
您的输入是否作为单行传递? - RomanPerekhrest
输入的第二行由 for 循环的第一次迭代处理。您从 2 开始索引并不改变这个事实。 - Kendas
你尝试了我的答案吗? - e4c5
哇,抱歉,我忘记接受答案了。 - Ch Y Duan
2个回答

6

@e4c5已经很好地解释了为什么会出现这个错误,所以我将跳过那部分内容。

如果您正在使用Python 3并且只对前两个值感兴趣,那么这是使用扩展可迭代解包的好机会。以下是一些简短的演示:

>>> n1, n2, *other = map(int, input().split())
1 2 3 4
>>> n1
1
>>> n2
2
>>> other
[3, 4]

other是“通配符”名称,可以捕获其余的值。 您可以通过检查 other 的真实性来检查用户是否提供了正好两个值:

>>> n1, n2, *other = map(int, input().split())
1 2
>>> if not other: print('exactly two values')
... 
exactly two values

请注意,如果用户提供的数字少于两个,此方法仍会引发 ValueError ,因为我们需要从列表 input()。split()中至少解包两个数字才能分配名称 n1 和 n2

2
这种情况可能发生在两个地方。
n, r = map(int, input().split())

并且

n1, n2 = map(int, input().split())

在这两种情况下,您假设输入只包含两个值。如果有3或20个呢?尝试使用以下方式:

for x in map(int, input().split()):
    # code here

或者将整个内容包裹在try/except中,以便处理过多的值。

你的for循环可能只需如下:

for i in range(2 , n):

    n_list.append(map(int, input().split())

仅返回第三行中的2个数字。 - Ch Y Duan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接