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

新手上路,请多包涵
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) 是如何工作的?如果用更冗长的代码编写它会是什么样子?

原文由 Oliver Zheng 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 531
2 个回答

iter() 是序列上的迭代器。 [x] * n produces a list containing n quantity of x , ie a list of length n , where each element is x*arg 将序列解压为函数调用的参数。因此,您将同一个迭代器 3 次传递给 zip() ,并且每次都从迭代器中提取一个项目。

 x = iter([1,2,3,4,5,6,7,8,9])
print zip(x, x, x)

原文由 Ignacio Vazquez-Abrams 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

正如 Ignacioujukatzel 所说,您传递给 zip() 对同一迭代器的三个引用,并且 zip() 从对迭代器的每个引用按顺序生成整数的三元组:

 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 /

原文由 mechanical_meat 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题