itertools.izip brokeness

Paul Rubin http
Tue Jan 3 06:20:16 EST 2006


bonono at gmail.com writes:
> But that is exactly the behaviour of python iterator, I don't see what
> is broken.

What's broken is the iterator interface is insufficient to deal with
this cleanly.

> And because python iterator can only go in one direction, those
> consumed do lose in the zip/izip calls.

Yes, that's the problem.  It's proven useful for i/o streams to support
a pushback operation like ungetc.  Maybe something like it can be done
for iterators.

> I think you need to use map(None,...) which would not drop anything,
> just None filled. Though you don't have a relatively lazy version as
> imap(None,...) doesn't behave like map but a bit like zip.

I don't understand what you mean by this?  None is not callable.

How about this (untested):

  def myzip(iterlist):
    """return zip of smaller and smaller list of iterables as the
individual iterators run out"""
    sentinel = object()  # unique sentinel
    def sentinel_append(iterable):
       return itertools.chain(iterable, itertools.repeat(sentinel))
    for i in itertools.izip(map(sentinel_append, iterlist)):
       r = [x for x in i.next() if x is not sentinel]
       if r: yield r
       else: break



More information about the Python-list mailing list