№38 Функция zip() / для начинающих

Предыдущий урок: Функция __main__

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

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

У функции zip() множество сценариев применения. Например, она пригодится, если нужно создать набор словарей из двух массивов, каждый из которых содержит имя и номер сотрудника.

В этом материале разберемся с основами этой функции, познакомимся с отличиями в Python 2 и Python 3, а также узнаем, в каких ситуациях zip() может быть полезна.

Обновление итератора Python

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

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

Пример работы функция zip() в Python

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

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


employee_numbers = [2, 9, 18, 28]
employee_names = ["Дима", "Марина", "Андрей", "Никита"]

zipped_values = zip(employee_names, employee_numbers)
zipped_list = list(zipped_values)

print(zipped_list)

Функция zip возвращает следующее:

[('Дима', 2), ('Марина', 9), ('Андрей', 18), ('Никита', 28)]

Эта программа создала массив из кортежей, каждый из которых содержит имя и номер сотрудника. Здесь много составляющих, поэтому разберем по порядку. На первых двух строках объявляются переменные, которые хранят номера и имена сотрудников. На следующей — функция zip() объединяет два списка вместе, создавая новый массив кортежей.

На следующей строке zip-элемент конвертируется в список так, чтобы его можно было выводить и использовать как список. И на финальной строке он уже и выводится.

Можно убедиться в том, что zipped_values — это элемент zip(), воспользовавшись следующим кодом:

Он вернет класс zip:

<class 'zip'>

В предыдущем примере были объединены два элемента. Но их может быть и больше. Нужно просто передать их в функцию zip().

Использование одного аргумента (или ни одного)

Пока что функция zip() использовалась для объединения двух итерируемых объектов. Но ее же можно использовать с одним или без единого аргумента. В таком случае она вернет пустой zip-объект. Вот пример:


zipped_object = zip()
print(list(zipped_object))

Этот код возвращает пустой итератор []. Результат не содержит никаких значений, потому что в функцию не были переданы аргументы. С другой стороны, если передать один аргумент, можно использовать следующий код:


employee_names = ["Дима", "Марина", "Андрей", "Никита"]
zipped_object = zip(employee_names)
print(list(zipped_object))

Эта программа возвращает следующее:

[('Дима',), ('Марина',), ('Андрей',), ('Никита',)]

Но передача одного аргумента в zip() редко используется — можно использовать существующий список и конвертировать его в кортеж. Здесь просто демонстрируется возможность подобного.

Функция zip с циклом for

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

Вот пример использования zip() для итерации по массивам:


employee_numbers = [2, 9, 18, 28]
employee_names = ["Дима", "Марина", "Андрей", "Никита"]

for name, number in zip(employee_names, employee_numbers):
print(name, number)

Этот код вернет следующее:

[('Дима', 2), ('Марина', 9), ('Андрей', 18), ('Никита', 28)]

В этом примере программа перебирает список кортежей, которые возвращает zip() и делит их на два: имена и номера. Это упрощает процесс перебора нескольких итерируемых объектов за раз. Если необходимо, можно перебирать три и больше объектов.

Как сделать «unzip»

В последнем коде были объединены разные типы данных. Но как восстановить их прежнюю форму? Если есть список кортежей (упакованных), которые нужно разделить, можно использовать специальный оператор функции zip(). Это оператор-звездочка (*).

Вот пример работы оператора распаковки в zip():


employees_zipped = [('Дима', 2), ('Марина', 9), ('Андрей', 18), ('Никита', 28)]
employee_names, employee_numbers = zip(*employees_zipped)

print(employee_names)
print(employee_numbers)

Этот код вернет такой результат:

("Дима", "Марина", "Андрей", "Никита")
(2, 9, 18, 28)

Это может казаться сложным, поэтому разберем по шагам. На первой строке определяется переменная, которая включает список кортежей. Затем еще две переменные: employee_names и employee_numbers. Им присваиваются значения функции распаковки.

Функция распаковки — это просто zip-функция, которая принимает переменную employee_zipped и использует оператор распаковки *. После этого выводятся две новые переменные, которые включают имена и номера сотрудников.

Выводы

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

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