提问者:小点点

当数组中元素的长度大于2时,“解包值太多(预期为2)”


也许问这个问题会很奇怪,因为我当然不明白。

例如,如果我们有a=[(1,2),(3,4)]; 手术有效

for x,y in a:
    print(x,y)

但是一旦我们向这些元组添加任何其他元素,a=[(1,2,3),(4,5,6)]

for x,y in a:
    print(x,y)
---------------
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: too many values to unpack (expected 2)

但是使用zip(A[0],A[1])可以

我看到这个问题以前已经被问过很多次了,但是我找不到任何一个能解释为什么大于2的len不起作用的问题。

谁能给我解释一下为什么?


共3个答案

匿名用户

由于您试图将3个元素的元组解包(分配给变量)为2个变量-xy,因此会引发太多值无法解包

如果元组由n元素组成,则应使用n变量将其解包,因此在您的情况下:

for x,y,z in a:
    pass

zip(a[0],a[1])之所以适合您,是因为zip在您的示例中创建了一个由2个元素元组组成的迭代器。 例如,如果您将其更改为zip(A[0],A[1],A[2]),它将无法工作,因为将创建3元素元组的迭代器。

匿名用户

因为a中的元组每个有三个元素,所以需要三个变量来解包它们。 也就是说,

for x,y,z in a:
    ...

您的zip示例之所以能够工作,是因为zip从迭代对象的各个元素中创建了一个元组(在本例中是元组)。 只有两个迭代被传递到zip(即A[0]A[1])。 这就是为什么您只需要两个变量就可以解包它们。

要更好地了解这一点,请尝试运行以下代码:

for x in a:
    print(x)

您将看到需要三个变量来表示x的各个值。

然后看一下的输出:

for x in zip(a[0],a[1]):
    print(x)

匿名用户

问得好。

a=[(1,2),(3,4)]的情况下,理解这些数据结构是什么很重要。

a是元组列表。 所以a[0](1,2)a[1](3,4)

因此,如果向其中一个元组添加更多元素,则实际上没有更改a。 因为,记住,a只是元组。 您正在更改元组中的值。 因此,a的长度永远不会改变。

如果要访问所述元组的值,可以执行print(A[0][0]),结果是0

一个示例程序,看看我的意思:

a = [(1,2), (3,4)]
b = [(1,2,3), (4,5,6)]

def understand_data(x):
    print("First, let's loop through the first structure and see what it is")
    print("You passed in: {}".format(type(x)))


    print("Now printing type and contents of the passed in object")
    for i in range(len(x)):
        print(type(x[i]))
        print(x[i])

    print("Now printing the contents of the contents of the passed in object")
    for i in range(len(x)):
        for j in range(len(x[i])):
            print(x[i][j])

    print("DONE!")

understand_data(a)
understand_data(b)

产量:

[Running] python -u "c:\Users\Kelly\wundermahn\example.py"
First, let's loop through the first structure and see what it is
You passed in: <class 'list'>
Now printing type and contents of the passed in object
<class 'tuple'>
(1, 2)
<class 'tuple'>
(3, 4)
Now printing the contents of the contents of the passed in object
1
2
3
4
DONE!
First, let's loop through the first structure and see what it is
You passed in: <class 'list'>
Now printing type and contents of the passed in object
<class 'tuple'>
(1, 2, 3)
<class 'tuple'>
(4, 5, 6)
Now printing the contents of the contents of the passed in object
1
2
3
4
5
6
DONE!

[Done] exited with code=0 in 0.054 seconds