В чем разница между функциями map и filter в Python?

Ответ

Обе функции обрабатывают итерируемые объекты, но решают разные задачи:

  • map() — применяет функцию к каждому элементу последовательности и возвращает итератор с преобразованными элементами.
  • filter() — проверяет каждый элемент с помощью функции-условия и возвращает итератор только с теми элементами, для которых условие истинно.

map(function, iterable)

Преобразует каждый элемент. Количество элементов в результате всегда равно количеству в исходной последовательности.

Пример: Получить квадраты чисел.

numbers = [1, 2, 3, 4]
squared_iterator = map(lambda x: x * x, numbers)

# Чтобы увидеть результат, преобразуем итератор в список
print(list(squared_iterator)) # Вывод: [1, 4, 9, 16]

filter(function, iterable)

Отбирает элементы по условию. Количество элементов в результате меньше или равно исходному.

Пример: Оставить только четные числа.

numbers = [1, 2, 3, 4, 5, 6]
even_iterator = filter(lambda x: x % 2 == 0, numbers)

print(list(even_iterator)) # Вывод: [2, 4, 6]

Альтернатива: Списковые включения (List Comprehensions)

Часто более читаемым и "pythonic" способом для тех же задач являются списковые включения.

numbers = [1, 2, 3, 4]

# Аналог map
squared_list = [x * x for x in numbers]
# [1, 4, 9, 16]

# Аналог filter
even_list = [x for x in numbers if x % 2 == 0]
# [2, 4]

Ответ 18+ 🔞

А, слушай, про эти ваши map и filter! Ну, блядь, как объяснить... Представь, у тебя есть куча кирпичей, и ты с ними что-то делаешь.

Вот map — это как взять каждый кирпич, сука, и покрасить его в синий цвет. Нахуя? А похуй, задача такая. На выходе у тебя столько же кирпичей, но все они теперь синие, блядь. Каждый, ёпта, обработан.

numbers = [1, 2, 3, 4]
squared_iterator = map(lambda x: x * x, numbers)
print(list(squared_iterator)) # [1, 4, 9, 16]

Видишь? Каждую циферку взял и впердолил в неё саму себя. Квадрат, блядь. Количество не изменилось — четыре было, четыре и стало.

А вот filter — это уже другая история, хитрая жопа. Это как взять ту же кучу кирпичей, но проверить каждый: а целый ли он, сука? Если треснутый — нахуй в сторону. Остаются только целые. На выходе кирпичей может быть меньше, а может, если все целые, — столько же.

numbers = [1, 2, 3, 4, 5, 6]
even_iterator = filter(lambda x: x % 2 == 0, numbers)
print(list(even_iterator)) # [2, 4, 6]

Смотри: из шести чисел только три прошли проверку на чётность. Остальные — пошли нахуй, в рот меня чих-пых! Их в результате и нет.

А теперь, самое охуенное, — есть же способ проще, без этих выебонов с lambda! Списковые включения, ёпта. Читается как обычная речь, почти.

numbers = [1, 2, 3, 4]

# Вместо map — просто сделай с каждым Х вот это
squared_list = [x * x for x in numbers]  # [1, 4, 9, 16]

# Вместо filter — бери Х, но только если он проходит условие
even_list = [x for x in numbers if x % 2 == 0]  # [2, 4]

Вот и вся магия, блядь. map — всех подряд красит, filter — отсеивает по признаку. А умные дяди чаще пишут вот так, в квадратных скобках, потому что это, блядь, сразу видно, что происходит, а не какая-то шаманская хуйня с итераторами.