这是一个优雅的解决方案:
def alternate(*iterators):
while len(iterators) > 0:
try:
yield next(iterators[0])
# Move this iterator to the back of the queue
iterators = iterators[1:] + iterators[:1]
except StopIteration:
# Remove this iterator from the queue completely
iterators = iterators[1:]
使用实际队列以获得更好的性能(如 David 所建议):
from collections import deque
def alternate(*iterators):
queue = deque(iterators)
while len(queue) > 0:
iterator = queue.popleft()
try:
yield next(iterator)
queue.append(iterator)
except StopIteration:
pass
即使某些迭代器是有限的而其他迭代器是无限的,它也可以工作:
from itertools import count
for n in alternate(count(), iter(range(3)), count(100)):
input(n)
印刷:
0
0
100
1
1
101
2
2
102
3
103
4
104
5
105
6
106
如果/当所有迭代器都用尽时,它也会正确停止。
如果要处理非迭代器可迭代对象,例如列表,可以使用
def alternate(*iterables):
queue = deque(map(iter, iterables))
...