Python ValueError:解包的值太多(预期为 2)

Ch *_*uan 2 python

输入

 2 4
 1 2 3 4
 1 0
 2 1
 2 3  
Run Code Online (Sandbox Code Playgroud)

我需要从第三行提取数字对到最后(第三行只有 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())
Run Code Online (Sandbox Code Playgroud)

我除了[[1,0],[2,1],[2,3]] 但说 ValueError: too many values to unpack (expected 2)

tim*_*geb 5

@e4c5 已经很好地解释了错误发生的原因,所以我将跳过那部分。

如果您使用的是 Python 3 并且只对前两个值感兴趣,那么这是使用Extended Iterable Unpacking的好机会。以下是一些简短的演示:

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

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

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

请注意,ValueError如果用户提供的数字少于两个,这种方法仍然会抛出 a ,因为我们需要从列表input().split()中解压缩至少两个以分配名称n1n2


e4c*_*4c5 2

有两个地方可能会发生这种情况

n, r = map(int, input().split())
Run Code Online (Sandbox Code Playgroud)

n1, n2 = map(int, input().split())
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,您都假设输入仅包含两个值。如果有3个或20个怎么办?尝试类似的东西

for x in map(int, input().split()):
    # code here
Run Code Online (Sandbox Code Playgroud)

或者将整个事情包装在 try/ except 中,以便干净地处理太多值。

你的 for 循环可能只是

for i in range(2 , n):

    n_list.append(map(int, input().split())
Run Code Online (Sandbox Code Playgroud)