Как работает функция `zip()`?

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

Длина итератора zip() определяется кратчайшим из входных итерируемых объектов. То есть, если один из итерируемых объектов короче остальных, итератор zip() остановится, когда достигнет конца этого кратчайшего объекта. Лишние элементы из более длинных итерируемых объектов будут проигнорированы.

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

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

Как это работает:

  • zip() берет первый элемент из каждой переданной последовательности и формирует из них первый кортеж.
  • Затем она берет второй элемент из каждой последовательности и формирует второй кортеж, и так далее.
  • Процесс продолжается до тех пор, пока хотя бы одна из последовательностей не закончится. Если последовательности имеют разную длину, zip() прекращает итерацию, как только самая короткая последовательность будет исчерпана. Все элементы из более длинных последовательностей, находящиеся за пределами длины самой короткой, игнорируются.
  • Возвращает итератор, генерирующий эти кортежи по запросу.

Пример:


    list1 = [1, 2, 3]
    list2 = ['a', 'b', 'c']
    list3 = ['!', '@', '#', '$']  # Длиннее остальных

    zipped = zip(list1, list2, list3) # Итератор, содержащий кортежи

    for item in zipped:
      print(item)

    # Вывод:
    # (1, 'a', '!')
    # (2, 'b', '@')
    # (3, 'c', '#')
  

Важные моменты:

  • Итератор: zip() возвращает итератор. Для получения списка кортежей необходимо использовать list(zip(...)).
  • Длина: Длина результирующего итератора определяется самой короткой последовательностью.
  • Распаковка: С помощью оператора * можно "распаковать" список последовательностей для передачи в zip().
  • Python 3: В Python 3, zip() возвращает итератор. В Python 2 он возвращал список.
  • Использование: Часто используется для одновременной итерации по нескольким связанным спискам, для создания словарей (ключи и значения берутся из разных списков) и для транспонирования матриц (список списков).

Распаковка с помощью `*`:


    data = [ [1, 2, 3], ['a', 'b', 'c'] ]
    zipped = zip(*data)  # Эквивалентно zip([1, 2, 3], ['a', 'b', 'c'])

    for item in zipped:
      print(item)

    # Вывод:
    # (1, 'a')
    # (2, 'b')
    # (3, 'c')
  

Обратное преобразование:


    list1 = [1, 2, 3]
    list2 = ['a', 'b', 'c']
    zipped = zip(list1, list2)
    unzipped = zip(*zipped) # обратное преобразование

    list1_new, list2_new = list(unzipped[0]), list(unzipped[1]) # преобразовать в списки (в Python 3)

    print(list1_new) # [1, 2, 3]
    print(list2_new) # ['a', 'b', 'c']
  

В общем, zip() - это удобный и эффективный инструмент для работы с несколькими последовательностями одновременно.

0