方法1:使用两个`itertools.cycle`对象。
import itertools
c = 'ABCD'
cyc1 = itertools.cycle(c)
cyc2 = itertools.cycle(c)
for _ in range(2): print(next(cyc1))
for _ in range(2): print(next(cyc2))
<script src="//repl.it/embed/IRcx/0.js"></script>
[首选解决方案] 方法2:使用itertools.tee
将其分割成n个迭代器。
import itertools
cyc = itertools.cycle('ABCD')
cyc1, cyc2 = itertools.tee(cyc, 2)
for _ in range(2): print(next(cyc1))
for _ in range(2): print(next(cyc2))
<script src="//repl.it/embed/IRcx/2.js"></script>
使用copy
模块时需要注意,使用copy.copy
函数并不能按预期创建迭代器的副本。
import itertools, copy
cyc = itertools.cycle('ABCD')
cyc1 = copy.copy(cyc)
cyc2 = copy.copy(cyc)
for _ in range(2): print(next(cyc1))
for _ in range(2): print(next(cyc2))
<script src="//repl.it/embed/IRcx/3.js"></script>
使用copy
模块的解决方法:可能的解决方案是使用copy.deepcopy
函数。
import itertools, copy
cyc = itertools.cycle('ABCD')
cyc1 = copy.deepcopy(cyc)
cyc2 = copy.deepcopy(cyc)
for _ in range(2): print(next(cyc1))
for _ in range(2): print(next(cyc2))
<script src="//repl.it/embed/IRcx/4.js"></script>
itertools.tee
函数可以将一个可迭代对象复制多份,返回一个元组,其中每个元素都是原始可迭代对象的独立副本。这些副本可以分别迭代,而不会相互干扰或消耗原始可迭代对象。 - vaultahitertools.tee
可以工作,但它需要存储原始cycle
迭代器的所有输出,包括循环回到自身时的重复输出。 - user2357112