Python zip - 为什么我们需要解压缩参数?

时间:2016-09-12 16:47:54

标签: python

*的输入是2D列表时,我试图理解使用zip解包参数的必要性。 docs州,

  

[zip]返回元组的迭代器,其中第i个元组包含来自每个参数序列或迭代的第i个元素。

所以,关于下面的第二个print声明,我预计它就像之前和之后的声明一样。我无法将zip的说明与此结果相关联。

MWE:

x = [1, 2, 3]
y = [4, 5, 6]

print zip(x, y)
print zip([x, y])  # don't understand this result
print zip(*[x, y])

结果:

[(1, 4), (2, 5), (3, 6)]
[([1, 2, 3],), ([4, 5, 6],)]
[(1, 4), (2, 5), (3, 6)]

1 个答案:

答案 0 :(得分:5)

考虑这个例子:

>>> x = [1, 2, 3]
>>> y = [4, 5, 6]
>>> z = [7, 8, 9]
>>> zip(x,y,z)
[(1, 4, 7), (2, 5, 8), (3, 6, 9)]
>>> zip(x,y)
[(1, 4), (2, 5), (3, 6)]
>>> zip(x)
[(1,), (2,), (3,)]
>>> zip()
[]

使用单个参数(甚至没有参数!)观察zip遵循相同的模式。它总是返回一系列元组,其中元组(如果有的话)与zip的参数具有相同数量的成员。即使zip只有一个参数。

现在考虑一下你问的问题:

zip([x, y])

只有zip只有一个参数! Zip不会试图变得聪明,并且在你给它的序列的元素内部戳。它不知道或不关心你给它的序列的元素本身是序列。 Zip(谢天谢地!)简单且可预测。如果你给它一个参数,它会返回一个1元组的序列。在这种情况下,这些1元组每个都包含一个列表,但同样,zip并不关心!它们可以是字符串或数字或None或任何东西!

>>> zip([x, y])
[([1, 2, 3],), ([4, 5, 6],)]
>>> zip([x, 'marmalade'])
[([1, 2, 3],), ('marmalade',)]
>>> zip([None, y])
[(None,), ([4, 5, 6],)]