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)
是如何工作的?如果它是用更冗长的代码编写的,它看起来会是什么样子?
发布于 2010-02-10 07:15:11
发布于 2015-05-22 01:29:40
我认为在所有答案中遗漏了一件事(对于那些熟悉迭代器的人来说可能是显而易见的),但对其他人来说不是那么明显的是-
因为我们有相同的迭代器,所以它被使用,其余的元素由zip使用。因此,如果我们只是使用列表而不是iter,例如。
l = range(9)
zip(*([l]*3)) # note: not an iter here, the lists are not emptied as we iterate
# output
[(0, 0, 0), (1, 1, 1), (2, 2, 2), (3, 3, 3), (4, 4, 4), (5, 5, 5), (6, 6, 6), (7, 7, 7), (8, 8, 8)]
使用迭代器,弹出值并保持可用,因此对于zip,一旦使用0,则1可用,然后是2,依此类推。一件非常微妙的事情,但相当聪明!
发布于 2010-02-10 07:23:28
iter(s)
返回s的迭代器。
[iter(s)]*n
生成一个n倍于s的相同迭代器的列表。
因此,在执行zip(*[iter(s)]*n)
时,它会按顺序从列表中的所有三个迭代器中提取一项。因为所有迭代器都是同一个对象,所以它只是将列表分组为n
块。
https://stackoverflow.com/questions/2233204
复制相似问题