0

我正在使用 iter(range()),但我还需要使用两次结果,假设j=iter(range(n,2n)

next(j)会是n,但是我需要next(j)再次确定而不向前迈进,这可能没有进一步的复杂性吗?

4

5 回答 5

2

您可以轻松编写一个生成器,将给定迭代器的每个元素重复两次:

def repeat_iter(iter, n = 2):
    for x in iter:
        for i in range(n):
            yield x

for x in repeat_iter(range(n)):
    print x

如果您的用例需要展望未来,请参阅此问题以获取一些不错的解决方案。

于 2013-10-24T19:48:02.597 回答
0

你可以使用zip

for a, b in zip(range(...), range(...)):
    ...
于 2013-10-24T20:08:17.513 回答
0

一种方法是显式获取两个迭代器,使用itertools.tee

iter1,iter2 = itertools.tee(iter(range(5,10)))

next(iter1)
Out[15]: 5

next(iter2)
Out[16]: 5

这可以更灵活,具体取决于您正在做什么,但缺点是您需要确保从两个迭代器中进行一对一的消费。

但老实说,我认为我从来没有发现自己这样做过range。当您分配next()给一个变量时,您可以根据需要多次访问它(a la for i in range),所以...

于 2013-10-24T19:59:38.523 回答
0

或者您可以使用生成器语句

for i in (j for j in range(n, 2 * n) for k in range(2)):
    pass
于 2013-10-24T19:59:44.890 回答
0

我相信shx2 的答案是该问题的正确答案。

然而,在这种情况下

  • 您只需要重用一些值,并且在创建迭代器时不知道您需要重新出现哪些值,或者
  • 某些值可能需要比其他值更频繁地重复,

send()那么这里有一个不同的生成器,可以通过内置对反馈做出反应。

def iter_with_standstill(iter):
    standstill = False
    for x in iter:
        while True:
            pause = yield x
            if pause is not None:
                standstill = pause
                yield None
            if not standstill:
                break

使用的技巧是任何调用generator.send(value)都会将 发送回value生成器,生成器接收它作为yield. 由于 anysend()会导致生成器也立即运行到下一个yield(),我们yield(None)在这里将控制权立即交还给调用代码。这种方法send()真正做到了单向操作。

以下是如何使用它:

orig = range(10)
paused = iter_with_standstill(orig)

waiting = None
for x in paused:
    if x in [4,7]:
        if waiting is None:
            waiting = 3
        waiting -= 1
        if waiting > 0:
            paused.send(True)
        else:
            paused.send(False)
            waiting = None
    print(x, end=' ')
print()

变量的全部意义在于waiting在值 4 和 7 处暂停,然后将这些值重复迭代 3 次。输出如下所示:

0 1 2 3 4 4 4 5 6 7 7 7 8 9 
于 2013-10-25T12:50:44.817 回答