2013-10-24 61 views

回答

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 

如果你的用例需要的是放眼望去,看到this question一些不错的解决方案。

0

一种方法是明确地得到两个迭代器,使用itertools.tee

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

next(iter1) 
Out[15]: 5 

next(iter2) 
Out[16]: 5 

这可能取决于你在做什么更灵活,但缺点是,你需要确保你会从两个迭代器中消耗1比1。

但说实话,我不认为我曾经发现我自己这样做与range。当您指定next()给一个变量,您可以访问它很多次,只要你想(一拉for i in range),所以...

0

或者您可以使用发电机声明

for i in (j for j in range(n, 2 * n) for k in range(2)): 
    pass 
0

你可以使用zip

for a, b in zip(range(...), range(...)): 
    ... 
0

我相信shx2's answer是正确答案的问题。

然而,在情况下

  • 你只需要重用的一些价值观,不知道在迭代器创建你需要重新出现哪些时间,或者
  • 一些值可能必须重复更经常比其他人,

然后这里是一个不同的发电机,可以通过send() builtin对反馈作出反应。

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结果发电机。由于任何send()都将导致发生器也立即运行到下一个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 
相关问题