Is there a zip-like function that pads to longest length? Is there a zip-like function that pads to longest length? python 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 module's 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)]


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)