Ответ
Обе функции обрабатывают итерируемые объекты, но решают разные задачи:
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 — отсеивает по признаку. А умные дяди чаще пишут вот так, в квадратных скобках, потому что это, блядь, сразу видно, что происходит, а не какая-то шаманская хуйня с итераторами.