import itertools itertools.zip_longest(*iterables, fillvalue=None)
*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)]