使用序列压缩迭代器的意外行为

时间:2014-08-29 15:11:39

标签: python python-2.7

在尝试解决特定的code golf问题时,我遇到了一个特定情况,我很难理解这种行为。

方案是zip带有序列的迭代器,并且在转置操作之后,迭代器是一个超出预期元素的。

>>> l = range(10)
>>> it = iter(l)
>>> zip(it, range(5))
[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)]
>>> next(it) #expecting 5 here
6 

我错过了一些明显的东西吗?

注意请为可能不明显的答案提供可靠的参考资料

2 个答案:

答案 0 :(得分:3)

我怀疑,当5试图压缩下一个项目时会消耗zip。当其中一个arg为"空":

时,Zip会停止
>>> l = range(10)
>>> it = iter(l)
>>> zip(range(5),it)
[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)]
>>> it.next()
5

通过撤消订单,zip知道它可以停止并且不会消耗它的下一个项目

答案 1 :(得分:1)

如果您想要参考,可以查看izip documentation。它提供了一个等效的实现:

def izip(*iterables):
    iterators = map(iter, iterables)
    while iterators:
        yield tuple(map(next, iterators))

由于预期list(izip(*args))zip(*args)具有相同的行为,因此您获得的结果实际上是逻辑行为。