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 许可协议
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 许可协议
其他很好的答案和评论很好地解释了 参数解包 和 zip() 的作用。
正如 Ignacio 和 ujukatzel 所说,您传递给 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
按照 start
和 end
的值:
[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 许可协议
2 回答5k 阅读✓ 已解决
2 回答1k 阅读✓ 已解决
4 回答937 阅读✓ 已解决
3 回答1.1k 阅读✓ 已解决
3 回答1.1k 阅读✓ 已解决
1 回答1.7k 阅读✓ 已解决
1 回答1.2k 阅读✓ 已解决
iter()
是序列上的迭代器。[x] * n
produces a list containingn
quantity ofx
, ie a list of lengthn
, where each element isx
。*arg
将序列解压为函数调用的参数。因此,您将同一个迭代器 3 次传递给zip()
,并且每次都从迭代器中提取一个项目。