Hmm, here's an approach using the .throw() operation from PEP 342. It's obviously untested, since that feature is not currently part of Python, probably incorrect, and maybe just insane. I renamed "append" to "insert_iterator" since "append" usually means put something at the end, not in the middle.
from itertools import cycle class InsertIterator(Exception): pass def itergen(self, *iters): while iters: try: for i,it in (enumerate(it) for it in cycle(iters)): yield it.next() except StopIteration: del iters[i] except InsertIterator, new_iterator: # maybe the i here should be i+1? iters = [new_iterator] + iters[i:] + iters[:i] Now you can say ig = itergen(it1,it2,...) for x in ig: .... and if you want to insert a new iterator, just say ig.throw(InsertIterator, new_iterator) -- http://mail.python.org/mailman/listinfo/python-list