zip

Функция zip() объединяет элементы из нескольких итерируемых объектов, создавая итератор из кортежей, где i-й кортеж содержит i-е элементы из всех последовательностей.

Синтаксис

zip(*iterables)

Аргументы

  • iterables:
    • Что означает: Итерируемые объекты для объединения.
    • Возможные значения: Любое количество итерируемых объектов (списки, строки, кортежи и т.д.).

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

Возвращает итератор, где каждый элемент — это кортеж из соответствующих элементов входных последовательностей. Итерация прекращается, когда исчерпан хотя бы один из аргументов.

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

nums = [1, 2, 3]
letters = ['a', 'b', 'c']
zipped = zip(nums, letters)
print(list(zipped))  # Вывод: [(1, 'a'), (2, 'b'), (3, 'c')]

# Пример с разной длиной
nums = [1, 2]
letters = ['a', 'b', 'c']
print(list(zip(nums, letters)))  # Вывод: [(1, 'a'), (2, 'b')]

Эквивалентный код

def pyplanet_zip(*iterables):
    iterators = [iter(it) for it in iterables]
    while True:
        try:
            yield tuple(next(it) for it in iterators)
        except StopIteration:
            break

Частые ошибки

  1. Ожидание, что результатом будет список:

    print(zip([1, 2, 3], ['a', 'b', 'c']))  # Вывод: <zip object>
    

    Как исправить: Оберните результат в list() или другой коллекционный тип для получения значений.

Часто задаваемые вопросы

  1. Что произойдёт, если итерируемые объекты имеют разную длину? Итерация прекращается на минимальной длине переданных объектов.

  2. Можно ли "развернуть" zip обратно? Да, используя оператор *:

    zipped = [(1, 'a'), (2, 'b'), (3, 'c')]
    nums, letters = zip(*zipped)
    print(nums)    # Вывод: (1, 2, 3)
    print(letters) # Вывод: ('a', 'b', 'c')