← Назад к вопросам

В чем разница между map и filter?

1.2 Junior🔥 161 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI28 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Разница между 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  # Вычисления остановились