在for循环中解压缩元组

C_Z*_*_Z_ 3 python

我在拆开元组时遇到了一些麻烦.具体来说,我不知道为什么这不起作用:

a = [0,1,2,3]
b = [4,5,6,7]
p = a,b

for i,k in p:
    print i,k

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-422-2ba96d641daa> in <module>()
----> 1 for i,k in p:
  2     print i,k
  3 

ValueError: too many values to unpack
Run Code Online (Sandbox Code Playgroud)

在我看来,像上面的代码应该解开元组中的两个列表p进入ik,但是这显然不是发生了什么,我不知道为什么.

所以,我想我有两个问题:

  1. 什么是for i,k in p真正做的,如果它不存在于元组解包列表
  2. 如何在for循环中轻松地从元组中解压缩列表?

预期的结果是:

[0,1,2,3]
[4,5,6,7]
Run Code Online (Sandbox Code Playgroud)

我正在使用python 2.7.9,如果这恰好是特定于版本的.

Mic*_*x2a 14

如果你一步一步走......

首先,做p = a, b会让你得到一个由2个元素组成的元组 - 你的列表:

>>> a = [0, 1, 2, 3]
>>> b = [4, 5, 6, 7]
>>> p = a, b
>>> print p
([0,1,2,3], [4, 5, 6, 7])
Run Code Online (Sandbox Code Playgroud)

然后,当你这样做时for i, k in p,Python将尝试获取内部的第一个项目,p然后将其解压缩到i,k.那么,你的循环的第一次迭代基本上是做与此相同的事情:

>>> temp = p[0]
>>> print temp
[0, 1, 2, 3]
>>> i, j = temp
Traceback (most recent call last):
  File "<stdin>", line 1 in <module>
ValueError: too many values to unpack
Run Code Online (Sandbox Code Playgroud)

这将失败,因为你基本上要做的是i, k = [0, 1, 2, 3],并且列表中有更多元素,那么有变量.

您可能希望使用zip函数,它将两个列表中的数字配对.

例如:

>>> p = zip(a, b)
>>> print p
[(0, 4), (1, 5), (2, 6), (3, 7)]
Run Code Online (Sandbox Code Playgroud)

这样,当我们运行你的循环时,第一个元组内的元素数量与循环中的变量数量相匹配,因此Python不会抛出错误.这意味着你的输出将是:

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

如果这不是您想要的输出,则需要重新考虑代码的结构.


编辑:

根据您的更新,如果您只想要输出:

[0, 1, 2, 3]
[4, 5, 6, 7]
Run Code Online (Sandbox Code Playgroud)

...然后你根本不需要使用拆包.以下循环可以正常工作:

for i in p:
    print i
Run Code Online (Sandbox Code Playgroud)

ip在第一次迭代中分配给第一个项目,然后在循环重复时分配给第二个项目.