7 уровней использования функции zip в Python

7 уровней использования функции zip в Python

IT Resume


Мастерство программирования - качество, которое отличает одного кандидата от другого на собеседовании. Вот почему мы уделяем этому вопросу очень пристальное внимание. Элегантность конструкций, краткость и лаконичность кода иллюстрируют мастерство и опыт программиста. 

В группе IT Resume мы уже рассматривали довольно много примеров того, как улучшить свой код на Python, как работать со строками в Python, обозревали основные функции библиотек и многое другое. А сегодня целую статью посвятим не всем известной, но очень полезной функции - zip. 

В Python zip - встроенная функция, которая может сделать код очень элегантным. Однако ее использование не очень интуитивно понятно для новичков, а иногда и вызывает ошибки.

Например, у нас есть матрица 2 * 3, представленная вложенным списком: 

А вот и популярный вопрос на собеседовании по Python:

Junior разработчик может написать несколько циклов for для его реализации, но Senior разработчику нужна всего одна строка кода: 

Элегантно, не правда ли?

Если вы еще не поняли вышеупомянутое решение, не беспокойтесь. Эта статья подробно расскажет о концепциях и использовании мощной функции zip

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

Уровень 0: Основы использования функции zip

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

Например, мы можем использовать ее для объединения двух списков следующим образом:

Как показано в приведенном выше примере, функция zip возвращает итератор кортежей, где i-й кортеж содержит i-й элемент каждого из списков.

Похоже на работу застежки на Вашей куртке, не так ли? 

Уровень 1: Соединение меньшего или большего количества элементов 

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

Если мы передадим один список функции zip:

Как насчет трех списков?

Как указано выше, независимо от того, сколько итерируемых объектов мы передали функции zip, она работает так, как и ожидалось.

Кстати, если аргумента нет, zip-функция просто возвращает пустой итератор.

Уровень 2: Работа с аргументами неравной длины

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

Как показано в приведенном выше коде, id - самый короткий список, поэтому record содержит только два кортежа, а последние два лидера в списке leaders были пропущены.

Что делать, если два последних лидера недовольны тем, что их игнорируют?

Python снова поможет нам. В модуле itertools есть еще одна функция - zip_longest. Как следует из названия, это сестра функции zip, и ее результат зависит от самого длинного аргумента.

Воспользуемся zip_longest для создания списка record:

Теперь ни Bill Gates, ни Yang Zhou не расстроятся. Необязательный аргумент fillvalue может помочь нам заполнить недостающие значения. Значение по умолчанию аргумента равно None, но мы можем поставить туда все, что угодно! Еще неизвестно, что было обиднее: не попасть в список record или получить рядом со своим именем что-нибудь эдакое. 😈

Уровень 3: Операция распаковки

В предыдущем примере, если мы сначала получаем список record, как мы можем разархивировать его на отдельные объекты?

К сожалению, в Python нет функции распаковки. Однако, если мы знакомы с уловками со звездочками, разархивирование - очень простая задача.

В приведенном выше примере звездочка выполнила операцию распаковки всех четырех кортежей из списка record.

Если мы не используем метод звездочки, следующий метод будет идентичным:


Уровень 4: Создание и обновление словарей с помощью функции zip

С помощью функции zip создавать или обновлять словари на основе отдельных списков очень просто. Есть два однострочных решения:

  • Использование dict comprehension и zip
  • Использование функции dict и zip

В приведенном выше примере циклы for вообще не используются. Как же это элегантно…!

Уровень 5: Использование функции zip в циклах for

Это распространенный сценарий, когда одновременно обрабатывается несколько итерируемых объектов. 

Проиллюстрируем это на следующем примере:

Есть ли более аккуратный способ реализовать приведенный выше пример? Едва ли.

Уровень 6: Транспонирование матрицы

Наконец, мы вернемся к вопросу с собеседования по Python:

Поскольку мы уже знакомы с функцией zip, распаковкой с помощью одной звездочки и dict comprehension, однострочное решение становится интуитивно понятным:

Эпилог

Функция zip в Python очень полезна и мощна. Его правильное использование может помочь нам писать меньше кода и выполнять больше операций. 

«Делай больше меньшими средствами» - это философия Python.

Еще больше тонкостей в использовании функций Python Вы найдете в группе

 IT Resume. Читайте о том, как улучшить свой код на Python, как работать со строками в Python и многом другом. 


Источник здесь


Report Page