在for循环中解压缩元组

时间:2015-08-07 15:44:26

标签: 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

在我看来,上面的代码应该将元组p中的两个列表解压缩到ik,但这显然不是什么&#39; s发生了,我不知道为什么。

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

  1. for i,k in p实际上做了什么,如果它没有解包元组中的列表
  2. 如何从for循环中的元组轻松解压缩列表?
  3. 预期结果是:

    [0,1,2,3]
    [4,5,6,7]
    

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

3 个答案:

答案 0 :(得分:14)

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

首先,做insert...select会得到一个由2个元素组成的元组 - 你的列表:

p = a, b

然后,当你执行>>> a = [0, 1, 2, 3] >>> b = [4, 5, 6, 7] >>> p = a, b >>> print p ([0,1,2,3], [4, 5, 6, 7]) 时,Python将尝试获取for i, k in p中的第一个项目,然后将其解压缩到i,k。那么,你的循环的第一次迭代基本上是做与此相同的事情:

p

这会失败,因为您基本上要做的是>>> 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 ,并且列表中有更多元素,然后有变量。

您可能希望使用http://hiptest.net功能,将两个列表中的数字配对。

例如:

i, k = [0, 1, 2, 3]

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

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

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

修改

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

0 4
1 5
2 6
3 7

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

[0, 1, 2, 3]
[4, 5, 6, 7]

for i in p: print i 将在第一次迭代中分配给i内的第一项,然后在循环重复时分配给第二项。

答案 1 :(得分:3)

p是(a,b)

由于您使用for循环迭代它,因此您将逐个获取元组中的每个项目:

for x in p:分配给x,然后b分配给x。在这种情况下,您的x为i,k。 a和b都是4个项目的列表,因此不能分配给两个项目。您可以执行for i,j,k,l in p,这将为您提供不同变量中的四个项目。

然而,这可以起作用:i, k = p,因为p是两个项目的元组。

答案 2 :(得分:0)

a = [1,2,3,4]
b = ['a','b','c','d']

for num, ch in zip(a, b):
        print(num, ch)