В этой статье мы рассмотрим, как использовать встроенную функцию 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, а не все сразу, как это делает список. Это более эффективно для больших последовательностей, которые потребляли бы очень много памяти при доступе ко всем сразу.