python – Is there a zip-like function that pads to longest length?

python – Is there a zip-like function that pads to longest length?

In Python 3 you can use itertools.zip_longest

>>> list(itertools.zip_longest(a, b, c))
[(a1, b1, c1), (None, b2, c2), (None, b3, None)]

You can pad with a different value than None by using the fillvalue parameter:

>>> list(itertools.zip_longest(a, b, c, fillvalue=foo))
[(a1, b1, c1), (foo, b2, c2), (foo, b3, foo)]

With Python 2 you can either use itertools.izip_longest (Python 2.6+), or you can use map with None. It is a little known feature of map (but map changed in Python 3.x, so this only works in Python 2.x).

>>> map(None, a, b, c)
[(a1, b1, c1), (None, b2, c2), (None, b3, None)]

For Python 2.6x use itertools modules izip_longest.

For Python 3 use zip_longest instead (no leading i).

>>> list(itertools.izip_longest(a, b, c))
[(a1, b1, c1), (None, b2, c2), (None, b3, None)]

python – Is there a zip-like function that pads to longest length?

non itertools Python 3 solution:

def zip_longest(*lists):
    def g(l):
        for item in l:
            yield item
        while True:
            yield None
    gens = [g(l) for l in lists]    
    for _ in range(max(map(len, lists))):
        yield tuple(next(g) for g in gens)

Leave a Reply

Your email address will not be published. Required fields are marked *