zip(* [iter(s)] * n)在Python中如何工作?



Answers

其他很好的答案和评论很好地解释了参数解包zip()

正如Ignacioujukatzel所说的,你将zip()传递给同一个迭代器的三个引用,并且zip()按顺序ujukatzel整数的三元组 - 从每个引用到迭代器:

1,2,3,4,5,6,7,8,9  1,2,3,4,5,6,7,8,9  1,2,3,4,5,6,7,8,9
^                    ^                    ^            
      ^                    ^                    ^
            ^                    ^                    ^

而且,由于您需要更详细的代码示例:

chunk_size = 3
L = [1,2,3,4,5,6,7,8,9]

# iterate over L in steps of 3
for start in range(0,len(L),chunk_size): # xrange() in 2.x; range() in 3.x
    end = start + chunk_size
    print L[start:end] # three-item chunks

遵循startend的值:

[0:3) #[1,2,3]
[3:6) #[4,5,6]
[6:9) #[7,8,9]

FWIW,你可以得到与map()相同的结果,初始参数为None

>>> map(None,*[iter(s)]*3)
[(1, 2, 3), (4, 5, 6), (7, 8, 9)]

有关zip()map()http://muffinresearch.co.uk/archives/2007/10/16/python-transposing-lists-with-map-and-zip/ : http://muffinresearch.co.uk/archives/2007/10/16/python-transposing-lists-with-map-and-zip/

Question
s = [1,2,3,4,5,6,7,8,9]
n = 3

zip(*[iter(s)]*n) # returns [(1,2,3),(4,5,6),(7,8,9)]

zip(*[iter(s)]*n)工作? 如果使用更详细的代码编写它会是什么样子?




iter(s)为s返回一个迭代器。

[iter(s)]*n列出了n次与s相同的迭代器。

因此,在执行zip(*[iter(s)]*n) ,它将按顺序从列表中的所有三个迭代器中提取项目。 由于所有迭代器都是同一个对象,因此它只是将列表按n块分组。




Links