我在拆开元组时遇到了一些麻烦。具体来说,我不知道为什么这不起作用:
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
中的两个列表解压缩到i
和k
,但这显然不是什么&#39; s发生了,我不知道为什么。
所以,我想我有两个问题:
for i,k in p
实际上做了什么,如果它没有解包元组中的列表预期结果是:
[0,1,2,3]
[4,5,6,7]
我使用python 2.7.9,如果这恰好是特定于版本的。
答案 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)