Difference between zip(list) and zip(*list)
我用的是清单
如果我这样做:
1 2 3 | >>>d=zip(p) >>>list(d) [([1, 2, 3],), ([4, 5, 6],)] |
不过,我真正想要的是通过以下方式获得:
1 2 3 | >>>d=zip(*p) >>>list(d) [(1, 4), (2, 5), (3, 6)] |
我发现在列表名称之前添加一个"*"会给出我所需的输出,但我无法区分它们的操作。你能解释一下区别吗?
考虑这个
1 2 | def add(x, y): return x + y |
如果您有一个清单
这就是您的示例中发生的事情。
因此,在这种情况下,
1 | zip([1,2,3],[4,5,6]) |
另外,请注意,由于python-3.5,除了在函数调用程序中,在其他一些情况下,您可以对运算符进行解包。其中一个称为就地解包,它允许您在另一个iterable中使用解包。
1 2 3 4 5 6 | In [4]: a = [1, 2, 3] In [5]: b = [8, 9, *a, 0, 0] In [6]: b Out[6]: [8, 9, 1, 2, 3, 0, 0] |
虽然这不是你问的问题的答案,但应该有帮助。因为zip用于组合两个列表,所以您应该像这样做
"*"运算符解包列表并将其应用于函数。zip函数接受n个列表,并从两个列表中的每个元素创建n个元组对:
zip([iterable, ...])
This function returns a list of tuples, where the i-th tuple contains
the i-th element from each of the argument sequences or iterables. The
returned list is truncated in length to the length of the shortest
argument sequence. When there are multiple arguments which are all of
the same length, zip() is similar to map() with an initial argument of
None. With a single sequence argument, it returns a list of 1-tuples.
With no arguments, it returns an empty list.
基本上,通过使用
简言之,使用
这就是为什么在python的文档中,您经常会看到
现在,当您使用zip时,实际上您希望使用[4,5,6]压缩[1,2,3],因此您希望将2个参数传递给zip,因此需要一个星形运算符。没有它,你只传递一个参数。