【问题标题】:How can I restart a string iterator endlessly?如何无休止地重新启动字符串迭代器?
【发布时间】:2015-08-27 19:30:32
【问题描述】:

这个问题与thisthisthis有几分关系。假设我有两个不同长度的生成器/迭代器:

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

现在我想知道:有没有更好、更紧凑的方法来做到这一点?像无休止的字符串连接之类的?

【问题讨论】:

    标签: python python-3.x iterator generator


    【解决方案1】:

    您可以使用itertools.cycle

    创建一个迭代器,从可迭代对象中返回元素并保存 每个副本。当可迭代对象用尽时,从 保存的副本。无限重复。

    它能够完全替换您的功能:

    from itertools import cycle as endless_s
    

    【讨论】:

    • 正是我想要的:for c, i in zip(itertools.cycle(s), r)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-31
    • 1970-01-01
    • 1970-01-01
    • 2012-10-23
    • 1970-01-01
    相关资源
    最近更新 更多