Использование функции map в Python
Встроенная в Python функция map() используется для применения функции к каждому элементу итерируемого объекта (например, списка или словаря) и возврата нового итератора для получения результатов. Функция map() возвращает объект map (итератор), который мы можем использовать в других частях нашей программы. Также мы можем передать объект map в функцию list() или другой тип последовательности для создания итерируемого объекта.
Функция map() имеет следующий синтаксис:
map(function, iterable, [iterable 2, iterable 3, ...])
Вместо использования цикла for функция map() дает возможность применить функцию к каждому элементу итерируемого объекта. Это повышает производительность, поскольку функция применяется только к одному элементу за раз без создания копий элементов в другом итерируемом объекте. Это особенно полезно при обработке больших наборов данных. Также map() может принимать несколько итерируемых объектов в качестве аргументов функции, отправляя в функцию по одному элементу каждого итерируемого объекта за раз.
В этом обучающем модуле мы рассмотрим три способа работы с map() : с функцией lambda , с определяемой пользователем функцией и со встроенной функцией, использующей несколько аргументов итерируемого объекта.
Использование функции Lambda
Первый аргумент map() — это функция, которую мы используем для применения к каждому элементу. Python вызывает функцию один раз для каждого элемента итериируемого объекта, который мы передаем в map() , и возвращает измененный элемент в объект map. В качестве первого аргумента функции мы можем передать определенную пользователем функцию или использовать функции lambda , особенно если выражение будет менее сложным.
Синтаксис map() с функцией lambda выглядит следующим образом:
map(lambda item: item[] expression, iterable)
С таким списком мы можем реализовать функцию lambda с выражением, которое хотим применить к каждому элементу в нашем списке:
numbers = [10, 15, 21, 33, 42, 55]
Чтобы применить выражение к каждому из наших чисел, мы можем использовать map() и lambda :
mapped_numbers = list(map(lambda x: x * 2 + 3, numbers))
Здесь мы декларируем элемент в нашем списке как x . Затем мы добавим наше выражение. Мы передадим список чисел как итерируемый объект для map() .
Для немедленного получения результатов мы распечатаем список объекта map :
print(mapped_numbers)
Output[23, 33, 45, 69, 87, 113]
Мы использовали list() , чтобы объект map был выведен как список, а не в трудной для интерпретации объектной форме, например: . Объект map является итератором наших результатов, чтобы мы могли использовать его в цикле for или использовать list() для превращения в список. Мы делаем это здесь, потому что это хороший способ просмотра результатов.
В итоге map() наиболее полезна для работы с большими наборами данных, чтобы мы могли работать с объектом map, и не использовали для них конструктор, например, list() .
Для небольших наборов данных список может быть более понятным, однако для этого обучающего модуля мы используем небольшой набор данных для демонстрации возможностей map() .
Реализация определяемой пользователем функции
Аналогично lambda мы можем использовать определенную функцию для применения к итерируемому объекту. Функции lambda более полезны при использовании выражения с одной строкой, определяемые пользователем функции лучше подходят для более сложных выражений. Если же нам нужно передать в функцию другой элемент данных, применяемый к итерируемому объекту, определяемые пользователем функции будут удобнее для чтения.
Например, в следующем итерируемом объекте каждый элемент является словарем, содержащим различные детали о каждом из существ в нашем аквариуме:
aquarium_creatures = [ "name": "sammy", "species": "shark", "tank number": 11, "type": "fish">, "name": "ashley", "species": "crab", "tank number": 25, "type": "shellfish">, "name": "jo", "species": "guppy", "tank number": 18, "type": "fish">, "name": "jackie", "species": "lobster", "tank number": 21, "type": "shellfish">, "name": "charlie", "species": "clownfish", "tank number": 12, "type": "fish">, "name": "olly", "species": "green turtle", "tank number": 34, "type": "turtle"> ]
Мы решили, что все существа в аквариуме будут перемещены в один и тот же резервуар. Нам нужно обновить наши записи, чтобы показать, что все наши существа перемещаются в резервуар 42 . Чтобы дать map() доступ к каждому словарю и каждой паре ключ:значение в словарях, мы построим вложенную функцию:
def assign_to_tank(aquarium_creatures, new_tank_number): def apply(x): x["tank number"] = new_tank_number return x return map(apply, aquarium_creatures)
Мы определяем функцию assign_to_tank() , которая принимает aquarium_creatures и new_tank_number в качестве параметров. В assign_to_tank() мы передаем apply() как функцию в map() в последней строке. Функция assign_to_tank возвратит iterator, полученный от map() .
apply() принимает в качестве аргумента x , что означает элемент в нашем списке — одиночный словарь.
Далее мы указываем, что x — это ключ «tank number» из aquarium_creatures , и что он должен хранить переданное значение new_tank_number . Мы возвратим каждый элемент после применения нового номера резервуара.
Мы вызовем assign_to_tank() с нашим списком словарей и новый номер резервуара, который нам нужно заменить для каждого существа:
assigned_tanks = assign_to_tank(aquarium_creatures, 42)
После выполнения функции мы сохраним объект фильтра в переменной assigned_tanks , которую мы превратим в список и распечатаем:
print(list(assigned_tanks))
Вывод программы будет выглядеть следующим образом:
Output[, , , , , ]
Мы присвоили новый номер резервуара нашему списку словарей. Используя функцию, которую мы определяем, мы включаем map() для эффективного применения функции к каждому элементу списка.
Использование встроенной функции с несколькими итерируемыми объектами
Помимо функций lambda и определяемых нами функций, мы можем использовать вместе с map() встроенные функции Python. Для применения функции с несколькими итерируемыми объектами мы передаем имя другого итерируемого объекта после первого. Рассмотрим в качестве примера функцию pow() , которая принимает два числа и возводит базовое число в указанную степень.
Здесь у нас списки целых чисел, которые мы хотим использовать с pow() :
base_numbers = [2, 4, 6, 8, 10] powers = [1, 2, 3, 4, 5]
Затем мы передадим pow() в качестве функции в map() и укажем два списка в качестве итерируемых объектов:
numbers_powers = list(map(pow, base_numbers, powers)) print(numbers_powers)
map() применит функцию pow() к тому же элементу в каждом списке для возведения в степень. Поэтому в результатах мы увидим 2**1 , 4**2 , 6**3 и т. д.:
Output[2, 16, 216, 4096, 100000]
Если мы передадим map() итерируемый объект, который будет длиннее другого итерируемого объекта, map() остановит расчеты после достижения конца наиболее короткого объекта. В следующей программе мы дополним base_numbers тремя дополнительными числами:
base_numbers = [2, 4, 6, 8, 10, 12, 14, 16] powers = [1, 2, 3, 4, 5] numbers_powers = list(map(pow, base_numbers, powers)) print(numbers_powers)
В расчетах программы ничего не изменится, и результат будет точно таким же:
Output[2, 16, 216, 4096, 100000]
Мы использовали функцию map() со встроенной функцией Python и посмотрели на одновременную обработку нескольких итерируемых объектов. Мы увидели, что map() продолжит обрабатывать несколько итерируемых объектов, пока не достигнет конца объекта, содержащего меньше всего элементов.
Заключение
В этом обучающем модуле мы узнали о различных способах использования функции map() в Python. Теперь вы можете использовать map() с собственной функцией, с функцией lambda и с любыми другими встроенными функциями. Также вы можете реализовать map() с функциями, для которых требуется несколько итерируемых объектов.
В этом обучающем модуле мы распечатали результаты map() в формате списка для демонстрационных целей. В наших программах мы обычно будем использовать возвращаемый объект map для дальнейших манипуляций с данными.
Для получения дополнительной информации о Python ознакомьтесь с нашей серией Программирование на Python 3 и посетите нашу тематическую страницу, посвященную Python. Чтобы узнать больше о работе с наборами данных в функциональном программировании, читайте нашу статью о функции filter() .
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
Функция map#
Функция map применяет функцию к каждому элементу последовательности и возвращает итератор с результатами.
Например, с помощью map можно выполнять преобразования элементов. Перевести все строки в верхний регистр:
In [1]: list_of_words = ['one', 'two', 'list', '', 'dict'] In [2]: map(str.upper, list_of_words) Out[2]: map at 0xb45eb7ec> In [3]: list(map(str.upper, list_of_words)) Out[3]: ['ONE', 'TWO', 'LIST', '', 'DICT']
str.upper(«aaa») делает то же самое что «aaa».upper() .
Конвертация в числа:
In [3]: list_of_str = ['1', '2', '5', '10'] In [4]: list(map(int, list_of_str)) Out[4]: [1, 2, 5, 10]
Вместе с map удобно использовать лямбда-выражения:
In [5]: vlans = [100, 110, 150, 200, 201, 202] In [6]: list(map(lambda x: 'vlan <>'.format(x), vlans)) Out[6]: ['vlan 100', 'vlan 110', 'vlan 150', 'vlan 200', 'vlan 201', 'vlan 202']
Если функция, которую использует map(), ожидает два аргумента, то передаются два списка:
In [7]: nums = [1, 2, 3, 4, 5] In [8]: nums2 = [100, 200, 300, 400, 500] In [9]: list(map(lambda x, y: x*y, nums, nums2)) Out[9]: [100, 400, 900, 1600, 2500]
List comprehension вместо map#
Как правило, вместо map можно использовать list comprehension. Чаще всего, вариант с list comprehension более понятный, а в некоторых случаях даже быстрее.
Но map может быть эффективней в том случае, когда надо сгенерировать большое количество элементов, так как map — итератор, а list comprehension генерирует список.
Примеры, аналогичные приведенным выше, в варианте с list comprehension.
Перевести все строки в верхний регистр:
In [48]: list_of_words = ['one', 'two', 'list', '', 'dict'] In [49]: [word.upper() for word in list_of_words] Out[49]: ['ONE', 'TWO', 'LIST', '', 'DICT']
Конвертация в числа:
In [50]: list_of_str = ['1', '2', '5', '10'] In [51]: [int(i) for i in list_of_str] Out[51]: [1, 2, 5, 10]
In [52]: vlans = [100, 110, 150, 200, 201, 202] In [53]: [f'vlan x>' for x in vlans] Out[53]: ['vlan 100', 'vlan 110', 'vlan 150', 'vlan 200', 'vlan 201', 'vlan 202']
Для получения пар элементов используется zip:
In [54]: nums = [1, 2, 3, 4, 5] In [55]: nums2 = [100, 200, 300, 400, 500] In [56]: [x * y for x, y in zip(nums, nums2)] Out[56]: [100, 400, 900, 1600, 2500]
Функция map() в Python, обработка последовательности без цикла
Применяет определенную функцию к каждому элементу в последовательности
Синтаксис:
map(function, iterable, . )
Параметры:
- function — пользовательская функция, вызывается для каждого элемента,
- iterable — последовательность или объект, поддерживающий итерирование.
Возвращаемое значение:
- map object — объект итератора.
Описание:
Функция map() выполняет пользовательскую функцию function для каждого элемента последовательности, коллекции или итератора iterable . Каждый элемент iterable отправляется в функцию function в качестве аргумента.
Если в map() передаётся несколько iterable , то пользовательская функция function должна принимать количество аргументов, соответствующее количеству переданных последовательностей, при этом function будет применяться к элементам из всех итераций параллельно.
# функция должна принимать столько # аргументов, сколько последовательностей # передается в функцию map() def plus(a, b, c): return a + b +c # функция 'plus' применяется к элементам # из всех последовательностей параллельно >>> x = map(plus, [1, 2], [3, 4], [5, 6]) >>> list(x) # [9, 12]
При использовании нескольких последовательностей, функция map() останавливается, когда исчерпывается самая короткая итерация.
def create_tuple(a, b): return a, b # функция `map()` останавливается, когда # заканчивается самая короткая последовательность >>> x = map(create_tuple, ['a', 'b'], [3, 4, 5]) >>> print(dict(x)) #
Можно также использовать любую встроенную функцию с функцией map() при условии, что функция принимает аргумент и возвращает значение.
>>> x = [1, 2, 3] >>> y = [4, 5, 6, 7] # вычисление при помощи встроенной функции 'pow()' # 'x' в степени 'y' для каждого элемента 2-х списков >>> list(map(pow, x, y)) # [1, 32, 729]
Для случаев, когда входные данные функции уже организованы в кортежи аргументов, смотрите функцию itertools.starmap() .
Преимуществ использования map() :
- Так как функция map() написана на языке C и хорошо оптимизирована, ее внутренний цикл более эффективный, чем обычный цикл for в Python.
- Низкое потребление памяти. С помощью цикла for .. in: программе необходимо хранить в памяти системы весь список элементов последовательности над которым производятся какие-то действия внутри цикла. При помощи функции map() элементы последовательности извлекаются по запросу, следовательно при каждом внутреннем цикле map() в памяти системы находится и обрабатывается только один элемент последовательности.
Примеры обработки последовательностей без циклов.
- Подсчет количества символов в каждом элементе кортежа;
- Создание словаря из двух списков;
- Удаление пунктуации в тексте.
Подсчет количества символов в каждом элементе кортежа:
>>> x = map(len, ('apple', 'banana', 'cherry')) >>> list(x) # [5, 6, 6]
Создание словаря из двух списков.
>>> x = map(lambda *args: args, [1, 2], [3, 4]) >>> dict(x) #
Удаление пунктуации в тексте при помощи map() .
>>> import re >>> def clean(word): . return re.sub(r"[`. ;,'\"()-]", "", word.strip()) >>> text = """С помощью цикла `for .. in:` программе необходимо хранить в памяти системы весь (список)! """ >>> word = text.split() >>> word = map(clean, word) >>> text = ' '.join(word) >>> text # 'С помощью цикла for in программе необходимо # хранить в памяти системы весь список'
- ОБЗОРНАЯ СТРАНИЦА РАЗДЕЛА
- Функция abs(), абсолютное значение числа
- Функция all(), все элементы True
- Функция any(), хотя бы один элемент True
- Функция ascii(), преобразует строку в ASCII
- Функция bin(), число в двоичную строку
- Класс bool(), логическое значение объекта
- Функция breakpoint(), отладчик кода
- Класс bytearray(), преобразует в массив байтов
- Класс bytes(), преобразует в строку байтов
- Функция callable(), проверяет можно ли вызвать объект
- Функция chr(), число в символ Юникода
- Класс classmethod, делает функцию методом класса
- Функция compile() компилирует блок кода Python
- Класс complex(), преобразует в комплексное число
- Функция delattr(), удаляет атрибут объекта
- Класс dict() создает словарь
- Функция dir(), все атрибуты объекта
- Функция divmod(), делит числа с остатком
- Функция enumerate(), счетчик элементов последовательности
- Функция eval(), выполняет строку-выражение с кодом
- Функция exec(), выполняет блок кода
- Функция filter(), фильтрует список по условию
- Класс float(), преобразует в вещественное число
- Функция format(), форматирует значение переменной
- Класс frozenset(), преобразует в неизменяемое множество
- Функция getattr(), значение атрибута по имени
- Функция globals(), переменные глобальной области
- Функция hasattr(), наличие атрибута объекта
- Функция hash(), хэш-значение объекта
- Функция help(), справка по любому объекту
- Функция hex(), число в шестнадцатеричную строку
- Функция id(), идентификатор объекта
- Функция input(), ввод данных с клавиатуры
- Класс int(), преобразует в тип int
- Функция isinstance(), принадлежность экземпляра к классу
- Функция issubclass(), проверяет наследование класса
- Функция iter(), создает итератор
- Функция len(), количество элементов объекта
- Класс list(), преобразовывает в список
- Функция locals(), переменные локальной области
- Функция map(), обработка последовательности без цикла
- Функция max(), максимальное значение элемента
- Класс memoryview(), ссылка на буфер обмена
- Функция min(), минимальное значение элемента
- Функция next(), следующий элемент итератора
- Класс object(), возвращает безликий объект
- Функция oct(), число в восьмеричную строку
- Функция open(), открывает файл на чтение/запись
- Функция ord(), число символа Unicode
- Функция pow(), возводит число в степень
- Функция print(), печатает объект
- Класс property(), метод класса как свойство
- Класс range(), генерирует арифметические последовательности
- Функция repr(), описание объекта
- Функция reversed(), разворачивает последовательность
- Функция round(), округляет число
- Класс set(), создает или преобразовывает в множество
- Функция setattr(), создает атрибут объекта
- Класс slice(), шаблон среза
- Функция sorted(), выполняет сортировку
- Декоратор staticmethod(), метод класса в статический метод
- Класс str(), преобразует объект в строку
- Функция sum(), сумма последовательности
- Функция super(), доступ к унаследованным методам
- Класс tuple(), создает или преобразует в кортеж
- Класс type(), возвращает тип объекта
- Функция vars(), словарь переменных объекта
- Функция zip(), объединить элементы в список кортежей
- Функция __import__(), находит и импортирует модуль
- Функция aiter(), создает асинхронный итератор
- Функция anext(), следующий элемент асинхронного итератора
Что такое map в питоне
Функция map является встроенной функцией языка и имеет следующий синтаксис:
map(func, *iterables) --> map object
Функция map принимает в качестве первого аргумента объект функцию, а в качестве второго аргумента — любой итерируемый объект, к которым относятся списки, кортежи, словари и т.д. И функция map будет вычислять значение функции, которую вы ей передали, над каждым элементом последовательности и вернет в качестве результата итератор map object, который легко можно будет преобразовать к списку или любой другой последовательности.
В примере выше мы передавали в качестве функции встроенную функцию abs, которая должна принимать одно значение и возвращать модуль числа. При передачи мы не указывали ни скобок после abs, ни передаваемого значения. Функция map будет сама брать поочередно значение из списка a и передавать его нашей функции abs.
В качестве функции вы также можете передавать собственные функции, которые вы создали при помощи инструкции def.
Ниже пример использования встроенной функции len для списка из строк.
Также в качестве функции вы можете передавать встроенные методы объектов. Например, у строк есть метод .upper(), который преобразует все буквы к большому регистру. Чтобы его передать, вы должны обратиться к встроенному объекту str и через точку написать название метода.
Также можно передавать в качестве функции lambda-выражения.
И пример ниже показывает как можно ввести несколько значений через пробел в одной строке