Функция zip python 3 своими руками

Добавил пользователь Алексей Ф.
Обновлено: 04.10.2024

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

Если функции zip не предоставлены итерируемые элементы, она возвращает пустой итератор.

Таким образом, она агрегирует элементы из итераций и возвращает итерации кортежей.

Синтаксис функции:
zip(*iterators)
Параметры:

Это могут быть контейнеры или итерируемые объекты (список, строка и т. д.)

Значение, возвращаемое функцией zip():

Возвращает итерируемые значения сопоставления объектов из соответствующих контейнеров.

Пример

Вывод:
The zipped outcome is :

zip() с несколькими итерациями

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

С неравной длиной итерируемых элементов

Для распаковки значений

Оператор "*" operator используется для распаковки значений, т.е. преобразования элементов обратно в индивидуальные и независимые значения.

Хороший день учащихся, надеюсь, что у вас все хорошо. Мы обсудили о Python Modulo в нашем предыдущем уроке. В этом руководстве мы узнаем о Python ZIP-функции.

Python Zip.

Если вы постоянный пользовательский пользователь, вы должны были использовать .zip расширение файла. Знаете ли вы, что это такое? В основном, .zip это сам контейнер. Он содержит реальный файл внутри.

Аналогично, Python Zip – это контейнер, который удерживает реальные данные внутри. Функция Python Zip принимает итогими элементами в качестве ввода и возвращает итератор. Если функция Python ZIP не получает никаких элементов, он возвращает пустой итератор.

Пример функции python zip

Давайте посмотрим на простой пример функции Python Zip. В предыдущем разделе мы рассказали об аргументах, сделанных Python ZIP и что он возвращается. Поэтому, проходя не аргумент, Zip возвращает пустой итератор.

Тем не менее, если мы пройдем два повторных объекта одинаковых длин, то утекаемое для кортежей Python будет возвращено там, где каждый элемент кортежа будет из этих намеков.

Функция Python Zip в основном используется для объединения данных двух уравновешиваемых элементов. Смотрите следующий код.

Таким образом, вывод вышеупомянутой программы Python Zip пример будет:

Обратите внимание на вывод вызова функции Python Type, поэтому ZIP-функция возвращает экземпляр класса Zip Python.

Пример Zip Python с намерениями элементов разной длины

Теперь, что произойдет, если мы попытаемся застеживать на молнии два или более повторяющихся элемента? Хорошо, в этом случае функция Python Zip добавит элементы до наименьшего возможного показателя тех, которые дают указываемые утеряемыми элементами.

Это означает, что подсчет кортежей будет таким же, как самая низкая длина заданного утекаемого элемента. В следующем примере поможет вам понять это.

Поэтому вывод этого кода будет

Экстракт Python Zip.

Мы также можем извлечь данные из функции Python ZIP. Чтобы извлечь ZIP, мы должны использовать то же самое zip () функция. Но мы добавили звездочку (*) перед этим списком, вы получаете от переменной на молнии.

Вы можете использовать Список () Функция, чтобы получить список от переменной на молнии. Однако это вернет ряд кортежей. Число будет отличаться в зависимости от количества аргументов, которые функция ZIP пришла к Zip данных. Смотрите следующий код, чтобы понять.

Это все для функции Python Zip. Надеюсь, что вы хорошо узнали. Для дальнейшего запроса, пожалуйста, используйте окно комментариев.

Оба не могут накапливать результат в списке. Это генераторы, которые возвращают значения как только те будут доступны.

2 ответа 2

основной вопрос - "ЗАЧЕМ" :)

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

используя функцию zip можно сильно сократить функцию enumerat :


Прежде чем говорить об упрощении надо обсудить функциональность. Выдержит ли enumerat такое применение?

sys.stdin поддерживает перечисление строк, но функция len к нему не применима (длина входного потока не известна) и обращаться по индексу тоже нельзя. Ваш вариант работает только со списками и кортежами ( tuple ) но не с любыми iterable . В документации приводится что-то вроде референсной реализации enumerate:

Этот вариант проще и работает с любым iterable .

С zip ситуация ещё хуже. Даже в документации примера нет.

Тут требуются объяснения. Самый общий протокол для iterable выглядит так:

Так как мы хотим обработать любые последовательности ( iterable ), следует использовать этот протокол.

Исключение ZipExit нужно так как это единственный способ сообщить об ошибке (кончились данные) при вычислении аргумента вызова tuple . Хочется бросать и ловить StopIteration но язык это явно запрещает. А любое другое стандартное исключение нельзя использовать так как такое же исключение можно получить при вызове next(it) , который может привести к исполнению кода на Python с произвольной логикой внутри. Поэтому уникальный тип исключения.

Вызовы map я поместил в комментарии на случай если вы хотите решение с минимумом обращений к глобальным функциям Python.

Если использовать map можно, то есть вариант проще:

Тут есть одно тонкое место: вызов next рано или поздно должен привести к выбрасыванию StopIteration и код завершится с ошибкой - из генераторов, а zip_ - генератор, бросать StopIteration нельзя. И однако этот код работает благодаря тому что вызов next делается в теле map , который перехватывает StopIteration (и только его) и возвращает не полный кортеж. Что проверяется и у нас есть шанс завершить zip_ нормально.

Хотя этот код выглядит просто, устроен он сложно. Я бы не рекомендовал это в качестве нормальной практики.

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

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

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

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

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

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

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

Как получить транспонирование указанной выше матрицы?


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

— Использование dict comprehension и zip

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

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

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

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

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

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

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

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

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

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

Как получить транспонирование матрицы?

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

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

Эпилог

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

Еще больше тонкостей в использовании функций Python Вы найдете в группе
IT Resume. Читайте о том, как улучшить свой код на Python, как работать со строками в Python и многом другом.

Читайте также: