Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Разница между map и filter в Python
map() и filter() — это встроенные функции Python, которые работают с итерируемыми объектами (списками, кортежами и т.д.). Они решают разные задачи и имеют принципиальные различия.
Основное назначение
map() — преобразует каждый элемент коллекции, применяя функцию ко всем элементам. filter() — выбирает элементы из коллекции на основе условия.
# map — трансформация
numbers = [1, 2, 3, 4, 5]
squared = map(lambda x: x ** 2, numbers)
print(list(squared)) # [1, 4, 9, 16, 25]
# filter — отбор
even_numbers = filter(lambda x: x % 2 == 0, numbers)
print(list(even_numbers)) # [2, 4]
map() — преобразование элементов
Функция map() применяет функцию к каждому элементу и возвращает новый объект с результатами:
def double(x):
return x * 2
values = [10, 20, 30]
result = map(double, values)
print(list(result)) # [20, 40, 60]
Можно использовать с несколькими итерируемыми объектами:
list1 = [1, 2, 3]
list2 = [10, 20, 30]
# Функция применяется к элементам обоих списков
result = map(lambda x, y: x + y, list1, list2)
print(list(result)) # [11, 22, 33]
filter() — отбор элементов
Функция filter() проверяет условие для каждого элемента и оставляет только те, для которых функция вернула True:
def is_positive(x):
return x > 0
numbers = [-5, -2, 0, 3, 7]
positive = filter(is_positive, numbers)
print(list(positive)) # [3, 7]
Типичный пример с лямбда-функцией:
students = [
{"name": "Alice", "grade": 85},
{"name": "Bob", "grade": 45},
{"name": "Charlie", "grade": 92}
]
# Отбираем студентов с оценкой >= 70
passed = filter(lambda s: s["grade"] >= 70, students)
for student in passed:
print(student)
# {"name": "Alice", "grade": 85}
# {"name": "Charlie", "grade": 92}
Сравнение в таблице
| Параметр | map() | filter() |
|---|---|---|
| Назначение | Трансформация | Отбор |
| Размер результата | Равен входу | <= входа |
| Функция должна | Вернуть новое значение | Вернуть True/False |
| Используй когда | Нужно изменить элементы | Нужно отобрать элементы |
Альтернативы: List Comprehension
В современном Python предпочитают использовать list comprehension вместо map() и filter() — это понятнее и производительнее:
# Вместо map()
squared = list(map(lambda x: x ** 2, [1, 2, 3]))
# Лучше
squared = [x ** 2 for x in [1, 2, 3]]
# Вместо filter()
even = list(filter(lambda x: x % 2 == 0, [1, 2, 3, 4]))
# Лучше
even = [x for x in [1, 2, 3, 4] if x % 2 == 0]
# Комбинация map + filter
result = list(map(lambda x: x ** 2, filter(lambda x: x % 2 == 0, [1, 2, 3, 4])))
# Лучше
result = [x ** 2 for x in [1, 2, 3, 4] if x % 2 == 0]
# [4, 16]
Практический пример
# Задача: получить квадраты чётных чисел из списка
numbers = [1, 2, 3, 4, 5, 6, 7, 8]
# Способ 1: map + filter (функциональный стиль)
result = list(map(lambda x: x ** 2, filter(lambda x: x % 2 == 0, numbers)))
# Способ 2: list comprehension (рекомендуется)
result = [x ** 2 for x in numbers if x % 2 == 0]
print(result) # [4, 16, 36, 64]
Ленивые вычисления
Обе функции возвращают итераторы, а не списки, что экономит память при работе с большими данными:
big_list = range(1000000)
# Не вычисляется сразу, только при обращении
mapped = map(lambda x: x ** 2, big_list)
for value in mapped:
if value > 1000:
break # Вычисления остановились