Loop in a loop?

Arnaud Delobelle arnodel at googlemail.com
Thu Jan 17 22:15:55 EST 2008


On Jan 17, 11:59 pm, Paul Hankin <paul.han... at gmail.com> wrote:

> Instead of counting the exceptions, we can limit the padding iterables
> by using an iterator that returns len(iterables) - 1 padding
> generators, use a sort of lazy chain, and then just izip.
>
> from itertools import izip, repeat
>
> def chain_next(xs, yg):
>     for x in xs: yield x
>     for y in yg.next(): yield y
>
> def izippad(*xs, **kw):
>     padder = repeat(kw.get('padding', None))
>     padder_gen = repeat(padder, len(xs) - 1)
>     return izip(*[chain_next(x, padder_gen) for x in xs])

I have had the need for such a 'padded zip' before and my
implementation was eerily similar:

from itertools import repeat, chain, izip

def repeatnext(iterator):
    val = iterator.next()
    while True: yield val

def longzip(default, *iterables):
    defaultgen = repeat(default, len(iterables) - 1)
    return izip(*[chain(it, repeatnext(defaultgen)) for it in
iterables])

--
Arnaud




More information about the Python-list mailing list