2015-06-11 27 views
0

這個問題與this,thisthis有一點關係。假設我有兩個發電機/不同長度的迭代器:如何無限重啓字符串迭代器?

>>> s = "abcde" 
>>> r = range(0, 16) 

我現在想重複迭代中較短直到有耗盡的時間越長。標準zip()函數終止一旦兩個較短的已耗盡:

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

最好我能想出的包裹串入一個發電機,像這樣:

>>> 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 

現在我想知道:有沒有更好更緊湊的方法來做到這一點?像無盡的字符串連接,還是一些這樣的?

回答

2

您可以用itertools.cycle做到這一點:

做一個迭代器返回從迭代元素和保存每一個 副本。當迭代器耗盡時,返回 保存的副本中的元素。重複無限期地。

這是能夠完全替代功能:

from itertools import cycle as endless_s 
+2

正是我一直在尋找:'爲C,I拉鍊(itertools.cycle(s),R)' – Jens