Как работает map python


Скачай курс
в приложении
Перейти в приложение
Открыть мобильную версию сайта
© 2013 — 2023. Stepik
Наши условия использования и конфиденциальности

Public user contributions licensed under cc-wiki license with attribution required
Map и filter в python
Всех приветствую, сегодня пойдет речь о функциях filter и map, которые часто используются совместно с lambda, так что затронем и её. Весь код размещен на GITHUB (все примеры пронумерованы в том же порядке, в котором они идут в посте).
Map
функция map принимает следующие аргументы map(func, *iterables) и возвращает итератор, чтобы его превратить в удобоваримый вид надо обернуть его в какую-либо структуру данных, далее в примерах мы будет превращать все итераторы в list. Что означает (*) перед iterables? Это указывает на то, что мы можем передавать сколь угодно большое число наших итерируемых объектов (списков, кортежей и т.д.), но из этого следует логичный вопрос, что если мы передали три списка, а количество элементов у них разное?
Давайте приведу пример функции, которая принимает два числа и возвращает их сумму:
def sum_two_number(x, y): return x + y ans = list(map(sum_two_number, , [1, 90])) print(ans)
В списке ans у нас будет храниться список, который будет равен [2, 92], почему так? Потому что мы пробегаем по первым min(len(*iterables)) аргументам и суммируем только их, остальные мы игнорируем, так например мы проигнорировали тройку в первом множестве .
Map используют с основными функциями, такими как str, strip, split, int и другими. Давайте представим, что вы спарсили айдишники сотрудников (изначально они в str) и хотим превратить их в int => напишем следующую строчку:
list_id = ['10', '20', '30', '40', '28'] print(list(map(int, list_id)))
Мы напечатаем список, в котором будет изменены все строчки на числа (ВНИМАНИЕ! ЕСЛИ МЫ НАПЕЧАТАЕМ list_id, ТО ОН ОСТАНЕТСЯ НЕИЗМЕННЫМ! map НЕ изменяет сам список)
Чтобы применить более сложные функции, например strip или split, то нужно написать чуть более сложную конструкцию. Например в txt файле данные хранятся так: ‘apple 1$ mango 20$ orange 3$’, мы уже превратили их в список и уже имеем [‘apple 1$’, ‘mango 20$’, ‘orange 3$’], а хотим получить на выходе это [[‘apple’, ‘1$’], [‘mango’, ’20$’], [‘orange’, ‘3$’]] чтобы получить нашу зарплату в 100000$ => нам нужно написать функцию map:
list_1 = ['apple 1$', 'mango 20$', 'orange 3$'] ans = list(map(str.split, list_1)) print(ans)
Мы как-бы применили к строчку определенную функцию, в данном случае split.
Приведу еще один пример с функцией map, допустим у нас есть n — ое количество сотрудников нашей компании, которые работают на удаленке и мы им должны выдать уникальные айдишники, по типу (пол сотрудника — ).
from random import randint used_id = [] list_employees = ['man', 'man', 'man', 'man', 'girl'] def get_random_id(user_now): global list_employees x = randint(0, len(list_employees)) while x in used_id: x = randint(0, len(list_employees)) used_id.append(x) return user_now + ' ' + str(x) print(list(map(get_random_id, list_employees)))
Это можно было решить простым перебором от 0 до len(list_employees), но так как мы хотим именно рандомные айди, то сделали чуть сложнее. Что мы делаем? мы создали функцию get_random_id, которая принимает текущего пользователя, затем получает рандомное число и сохраняет его в список used_id (чтобы id не повторялись).
Также можно переписать данное решение без применение map:
from random import randint used_id = [] list_employees = ['man', 'man', 'man', 'man', 'girl'] len_employee = len(list_employees) for i in range(len_employee): x = randint(0, len_employee) while x in used_id: x = randint(0, len_employee) used_id.append(x) list_employees[i] += ' ' + str(x) print(list_employees)
Мы получим аналогичный результат, но в первом случае мы не только получили более читаемый и приятный глазу код, но можем использовать данную функцию много раз в коде => соблюдаем основной принцип разработки DRY (Don’t repeat yourself)
Разберемся теперь с lambda функцией и как её совмещать с map, вообще lambda функции — это отдельная тема для разговора и про неё можно много что сказать, так что углубляться в дебри не будем, а скажу, что это тоже самое, что и функция, только написана в одну строчку. Сравним lambda и def:
list_1 = [1, 2, 3, 4] list_2 = [10, 20, 30, 40] def power(x, y): return x * y ans_lambda = list(map(lambda x, y: x * y, list_1, list_2)) ans_def = list(map(power, list_1, list_2)) print(ans_lambda, ans_def)
lambda функцию вы ВСЕГДА можете заменить аналогичной функцией def, lambda функции используют лишь для того, чтобы не было нагромождение бессмысленных функций и код был более понятен.
Filter
В функция filter принимает следующие параметры: filter (function, iterable), что означает, что он принимает только 2 аргумента — функция и структура данных к которой будет применена фильтрация, то есть выборка элементов, которые удовлетворяют функции. Возвращает итератор, с подходящими под условие (заданное function) элементами iterable.
Приведу такой пример: У нас есть сайт, на котором зарегистрированы люди от 0 до 99 лет. Мы хотим узнать сколько людей у нас на сайте старше 50 лет, для этого напишем следующее:
list_ages = [['user1', 90], ['user2', 78], ['user3', 40], ['user4', 3]] result_sum = list(filter(lambda current_user: current_user[-1] > 50, list_ages)) print(result_sum)
В итоге получим такой результат: [[‘user1’, 90], [‘user2’, 78]], то есть мы получили те элементы, которые подошли под условие current_user[-1] > 50
Надеюсь вы поняли что такое map и filter.
Если вам понравилось как я пишу, можете посетить мои остальные аккаунты:
Функция map() в Python
Если вы учитесь программировать, то функция map() в Python — это ваша возможность повысить свой уровень и упростить решение некоторых задач.
Представьте себе: вы хотите стать более эффективным разработчиком. Вы хотите, чтобы ваш код компилировался быстрее. Вы хотите произвести впечатление на коллег своими глубокими знаниями в области программирования. Если что-то из этого находит отклик у вас в душе, значит, вы попали в нужное место.
Прежде чем двигаться дальше, давайте разберемся, что такое функции и итерируемые объекты. Функции — это код, который выполняет определенную задачу. Например: len() , print() , str() . Итерируемые объекты — это объекты, содержащие один или несколько членов. К итерируемым объектам относят списки, кортежи, словари и др.
Функция map() в Python — это функция, которая позволяет вам преобразовывать весь итерируемый объект с помощью другой функции. Ключевой концепцией здесь являются преобразования, которые могут включать:
- преобразование строк в числа
- округление чисел
- получение длины каждого повторяемого члена
- и пр.
На данном этапе может возникнуть вопрос: а почему нельзя просто сделать это с помощью цикла for ? Ответ прост: можно, но использование функции map() сэкономит память (а это значит, что ваш код будет работать быстрее). Более того, решение с использованием map() делает ваш код более компактным.
Давайте рассмотрим пример, чтобы вы могли понять, что мы имеем в виду. Допустим, у вас есть список строк list_of_strings = [«5», «6», «7», «8», «9», «10»] , которые на самом деле являются числами. Нужно преобразовать этот список в список целых чисел. Для этого можно использовать пустой список и цикл for :
list_of_strings = ["5","6","7","8","9", "10"] result = [] for string in list_of_strings: result.append(int(string)) print(result)
Если вы запустите этот пример, вы получите: [5, 6, 7, 8, 9, 10].
Что при использовании цикла for происходит под капотом?
Мы можем быть довольны результатом преобразования списка строк в список чисел, но давайте подумаем о том, что только что сделал наш код.
Мы сказали компьютеру пройтись по каждому члену («5», «6», «7» и т.д.), преобразовать член, а затем сохранить его в новом списке. Хотя использование цикла for для преобразования списка является функциональным, это не оптимальное решение.
Функция map() в Python

Чтобы получить такой же рабочий, но при этом более оптимальный результат, давайте используем функцию map() .
Будем работать с тем же списком — list_of_strings = [«5», «6», «7», «8», «9», «10»] . А для преобразования списка строк в список целых чисел воспользуемся функцией Python map() :
result = map(int,list_of_strings) print(list(result))
Если вы запустите этот пример, вы получите результат, аналогичный полученному при помощи цикла for .
Прежде чем мы выясним, почему функция map() в Python более оптимальна, чем использование цикла for , давайте разберемся с тем, что мы только что сделали.
По сути, мы лишь создали переменную, хранящую список строк, которые мы хотим преобразовать в числа.
result = map(int, list_of_strings)
Давайте разберем, как работает приведенный выше код. Синтаксис функции map() в Python следующий:
map (функция, итерируемый объект)
map() — это просто имя функции, здесь ничего особенного.
Первым аргументом функция map() принимает другую функцию. В приведенном выше примере кода мы использовали функцию int . Мы могли бы использовать другую встроенную функцию, скажем, len() , или создать нашу собственную функцию и использовать ее здесь.
Вторым аргументом для map() идет сам итерируемый объект. В нашем примере это список list_of_strings . Наш преобразованный список мы запишем в переменную result .
Перейдем к последней строке кода. Опять же, будем работать изнутри:
print(list(result))
list() принимает наши недавно преобразованные итерируемые элементы и сообщает компьютеру, что эти элементы являются частью списка. print() выводит наш новый список.
Что при использовании функции map() происходит под капотом?
Вместо перебора каждого члена списка строк функция map() преобразовала весь список строк в список чисел. Вы сэкономили память, и ваш код сработал быстрее. Поставленная задача выполнена наиболее оптимальным способом.
Заключение
Наконец, функция map() более элегантна, чем цикл for . Она помогает быстрее скомпилировать код. Также использование функции map() поможет вывести ваши навыки программирования на новый уровень и стать более «подкованным» программистом.
Однако не стоит забывать что, функция map() в Python – это только начало. В этом языке есть еще множество различных трюков, которые помогут вам писать более элегантный код и эффективнее решать поставленные задачи.
Примечание редакции Pythonist. Если хотите почитать более подробный материал о функции map() , можем предложить небольшой цикл статей:
- Знакомство с map() в Python
- Преобразование итераций строк и чисел с помощью map()
- Комбинирование map() с другими инструментами и кодинг в стиле Python
Как работает функция map()?
Добавьте list перед map, и будет вам список. Так как в python 3 вам возвращается итератор, а не список как в python 2.
11 ноя 2016 в 9:07
@Avernial: проще звезду добавить: print(*map(.. , чтобы передать каждый возвращаемый map() элемент как отдельный аргумент для print() функции.
11 ноя 2016 в 16:29
Да, конечно, можно распаковку использовать.
12 ноя 2016 в 5:02
11 мар 2018 в 13:29
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Функция map итерирует коллекции, которые в нее передаются, применяя к элементам коллекций функцию и возвращает объект-итератор с результатом выполнения той функции.
Семантика функции такая: map(function, iterable, . )
Минимальный и простейший пример — это конвертация списка строк в список чисел, пример:
>>> map(int, ["1", "2", "3", "4"])
Как видно, мы получили объект, а не список, так и должно быть, а чтобы получить список, нужно:
>>> list(map(int, ["1", "2", "3", "4"])) [1, 2, 3, 4]
Сейчас я перехожу к самой сути вопроса с map(f, a, b) .
Если же в map помещать не одну коллекцию, а несколько, то функция получит в аргументы за раз по одному элементу из каждой коллекции:
def f(a, b): return int(a), int(b) >>> a = ["1", "2"] >>> b = ["3", "4"] >>> list(map(f, a, b)) [(1, 3), (2, 4)]
Еще больше коллекций:
def f(a, b, c): return int(a), int(b), int(c) >>> a = ["1", "2"] >>> b = ["3", "4"] >>> c = ["5", "6"] >>> list(map(f, a, b, c)) [(1, 3, 5), (2, 4, 6)]
