Как использовать `zip()` с коллекциями?

Используйте zip() для параллельной итерации по нескольким коллекциям (спискам, кортежам, и т.д.). Он создает итератор кортежей, где каждый кортеж содержит элементы с одинаковым индексом из каждой переданной коллекции. Итератор завершается, когда заканчивается самая короткая коллекция.
Пример:

  names = ['Alice', 'Bob', 'Charlie']
  ages = [25, 30, 28]
  
  for name, age in zip(names, ages):
      print(f"{name} is {age} years old")
  

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

Базовое использование:


list1 = [1, 2, 3]
list2 = ['a', 'b', 'c']
list3 = [10, 20, 30]

zipped = zip(list1, list2, list3)
print(list(zipped))  # Вывод: [(1, 'a', 10), (2, 'b', 20), (3, 'c', 30)]
  

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

Разная длина коллекций:

Если коллекции имеют разную длину, zip() прекращает работу, когда заканчивается самая короткая коллекция. Элементы из более длинных коллекций, которые не имеют пары, игнорируются.


list1 = [1, 2, 3, 4]
list2 = ['a', 'b', 'c']

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

В Python 3, zip() возвращает итератор, а не список. Чтобы получить список, необходимо преобразовать итератор в список с помощью list().

Распаковка zip объекта:

Иногда нужно выполнить обратную операцию: разделить zip-объект обратно на исходные коллекции. Это можно сделать с помощью оператора * (распаковка) в сочетании с zip():


list1 = [1, 2, 3]
list2 = ['a', 'b', 'c']

zipped = zip(list1, list2)
unzipped = zip(*zipped) # Обратите внимание на звездочку

list1_unpacked, list2_unpacked = map(list, unzipped) # Преобразуем итераторы в списки

print(list1_unpacked) # Вывод: [1, 2, 3]
print(list2_unpacked) # Вывод: ['a', 'b', 'c']
  

Важно отметить, что после первого использования zipped итератор может быть исчерпан, поэтому для распаковки используйте zip(*zipped) сразу после его создания.

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

  • Создание словарей: dict(zip(keys, values))
  • Итерация по нескольким коллекциям одновременно: for x, y in zip(list1, list2): ...
  • Транспонирование матриц (списков списков).
0