Функция zip() в Python

В этой статье мы рассмотрим, как использовать встроенную функцию zip() в Python.

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

Например, предположим, что у нас есть два списка ниже:

>>> vehicles = ['unicycle', 'motorcycle', 'plane', 'car', 'truck']
>>> wheels = [1, 2, 3, 4, 18]

Мы можем использовать функцию zip() для связывания элементов из этих двух списков в зависимости от их порядка:

>>> list(zip(vehicles, wheels))
[('unicycle', 1), ('motorcycle', 2), ('plane', 3), ('car', 4), ('truck', 18)]

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

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

>>> vehicles = ['unicycle', 'motorcycle', 'plane', 'car', 'truck']
>>> wheels = [1, 2, 3]
>>> list(zip(vehicles, wheels))
[('unicycle', 1), ('motorcycle', 2), ('plane', 3)]

Поскольку в этом примере список колес короче (3 элемента вместо 5, которые есть у автомобилей), последовательность остановилась на «плоскости».

Как упоминалось ранее, функция zip() может использоваться более чем с двумя последовательностями:

>>> vehicles = ['unicycle', 'motorcycle', 'plane', 'car', 'truck']
>>> wheels = [1, 2, 3, 4, 18]
>>> energy_sources = ['pedal', 'gasoline', 'jet fuel', 'gasoline', 'diesel']
>>> list(zip(vehicles, wheels, energy_sources))
[('unicycle', 1, 'pedal'), ('motorcycle', 2, 'gasoline'), ('plane', 3, 'jet fuel'), ('car', 4, 'gasoline'), ('truck', 18, 'diesel')]

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

>>> for i in range(len(vehicles)):
...     print('A ' + vehicles[i] + ' has ' + str(wheels[i]) + ' wheels and runs on ' + energy_sources[i])
...
A unicycle has 1 wheels and runs on pedal
A motorcycle has 2 wheels and runs on gasoline
A plane has 3 wheels and runs on jet fuel
A car has 4 wheels and runs on gasoline
A truck has 18 wheels and runs on diesel

Но с функцией zip() мы можем использовать следующий более чистый синтаксис с помощью распаковки кортежей:

>>> for v, w, es in zip(vehicles, wheels, energy_sources):
...     print('A ' + v + ' has ' + str(w) + ' wheels and runs on ' + es)
...
A unicycle has 1 wheels and runs on pedal
A motorcycle has 2 wheels and runs on gasoline
A plane has 3 wheels and runs on jet fuel
A car has 4 wheels and runs on gasoline
A truck has 18 wheels and runs on diesel

И последнее, что нужно понять о функции zip(), – это то, что она фактически возвращает итератор, а не список кортежей. Обратите внимание, что в наших первых двух примерах выше мы заключили функцию zip() в тип list(), чтобы преобразовать результат в список. Если бы мы попытались отобразить возвращаемое значение функции zip() напрямую, мы бы увидели что-то вроде этого:

>>> zip(vehicles, wheels)
<zip object at 0x1032caf48>

Этот «zip-объект» является итеративным экземпляром класса Zip, что означает, что он будет возвращать свое содержимое одно за другим в цикле for, а не все сразу, как это делает список. Это более эффективно для больших последовательностей, которые потребляли бы очень много памяти при доступе ко всем сразу.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *