如何无休止地重启字符串迭代器?

时间:2015-06-11 21:49:09

标签: python python-3.x iterator generator

此问题与thisthisthis有些相关。假设我有两个不同长度的生成器/迭代器:

>>> for c, i in zip(s, r) :
...     print(c, i)
... 
a 0
b 1
c 2
d 3
e 4

我现在想重复迭代较短的一个,直到较长的一个用尽。标准zip()函数在两者中较短的一个用完后终止:

>>> def endless_s(s) :
...     while True :
...         for c in s :
...             yield c

我能想到的最好的方法是将字符串包装成一个生成器,如下所示:

>>> _s = endless_s(s)
>>> for c, i in zip(_s, r) :
...     print(c, i)
... 
a 0
b 1
c 2
d 3
e 4
a 5
b 6
c 7
d 8
e 9
a 10
b 11
c 12
d 13
e 14
a 15

给了我想要的结果

@font-face {
  font-family: 'BrauerNeue';
  src: url(brauerneue.ttf);
}

h1 {
    font-family: 'BrauerNeue';
}

现在我想知道:有更好更紧凑的方式吗?就像一个无尽的字符串连接,或者一些这样的?

1 个答案:

答案 0 :(得分:2)

您可以使用itertools.cycle执行此操作:

  

使迭代器从iterable返回元素并保存a   每个的副本。当iterable耗尽时,返回from中的元素   保存副本。无限期地重复。

可以完全替换你的功能:

from itertools import cycle as endless_s