You can define alternate as follows:
import itertools def alternate(*iters): for elt in itertools.chain.from_iterable( itertools.izip(*iters)): yield elt print list(alternate(xrange(1, 7, 2), xrange(2, 8, 2)))
This leaves open the question of what to do if one iterator stops before another. If you want to continue until the longest iterator has been exhausted, you can use itertools.izip_longest instead of itertools.izip .
import itertools def alternate(*iters): for elt in itertools.chain.from_iterable( itertools.izip_longest(*iters)): yield elt print list(alternate(xrange(1, 7, 2), xrange(2, 10, 2)))
This will cause damage.
[1, 2, 3, 4, 5, 6, None, 8]
Note None appears when the xrange (1,7,2) iterator calls StopIteration (has no more elements).
If you want to just skip the iterator instead of yielding None , you can do this:
Dummy=object() def alternate(*iters): for elt in itertools.chain.from_iterable( itertools.izip_longest(*iters,fillvalue=Dummy)): if elt is not Dummy: yield elt
unutbu Jan 07 '10 at 2:54
source share