zip-как функция, которая прокладывает до самой длинной длины?


есть ли встроенная функция, которая работает как zip() но это будет дополнять результаты так, что длина результирующего списка равна длине длинной вход, а не короткий вход?

>>> a=['a1']
>>> b=['b1','b2','b3']
>>> c=['c1','c2']

>>> zip(a,b,c)
[('a1', 'b1', 'c1')]

>>> What command goes here?
[('a1', 'b1', 'c1'), (None, 'b2', 'c2'), (None, 'b3', None)]
3 118

3 ответа:

в Python 3 Вы можете использовать itertools.zip_longest

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

вы можете заполнить с другим значением, чем None С помощью :

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

С Python 2 Вы можете использовать itertools.izip_longest (в Python 2.6+), или вы можете использовать map С None. Это малоизвестно особенность mapmap изменено в Python 3.x, так что это работает только в Python 2.икс.)

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

для Python 2.6 x Используйте itertools модуль izip_longest.

для Python 3 Используйте zip_longest (не i).

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

non itertools Python 3 решение:

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)