Сообщить об ошибке.

Функция zip_longest() модуля itertools в Python

Объединить несколько списков разной длины в список кортежей

Синтаксис:

import itertools

itertools.zip_longest(*iterables, fillvalue=None)

Параметры:

Возвращаемое значение:

Описание:

Функция zip_longest() модуля itertools создает итератор, который объединяет элементы из каждой итерируемой последовательности *iterables в кортежи.

Отличие функции itertools.zip_longest() от встроенной функции zip() заключается в том, что zip() останавливается по исчерпании самой короткой входной последовательности и отбрасывает несопоставимые значения более длинных итераций, в то время как itertools.zip_longest() работает пока самая длинная итерация не будет исчерпана, а пропущенные элементы заполняются значением fillvalue.

Функция itertools.zip_longest() примерно эквивалентна следующему коду:

def zip_longest(*args, fillvalue=None):
    # zip_longest('ABCD', 'xy', fillvalue='-') --> Ax By C- D-
    iterators = [iter(it) for it in args]
    num_active = len(iterators)
    if not num_active:
        return
    while True:
        values = []
        for i, it in enumerate(iterators):
            try:
                value = next(it)
            except StopIteration:
                num_active -= 1
                if not num_active:
                    return
                iterators[i] = repeat(fillvalue)
                value = fillvalue
            values.append(value)
        yield tuple(values)

Примеры использования:

>>> from itertools import zip_longest
>>> a = list(range(5))
>>> b = list(range(3, 10))
>>> rez = zip_longest(a, b, fillvalue=100)
>>> list(rez)
# [(0, 3), (1, 4), (2, 5), (3, 6), (4, 7), (100, 8), (100, 9)]

# встроенная функция zip()
>>> rez = zip(a, b)
>>> list(rez)
# [(0, 3), (1, 4), (2, 5), (3, 6), (4, 7)]