Функция filter() оставляет элементы, для которых проверка возвращает истинное значение.
Что такое filter()?
filter() отбирает элементы, для которых функция-проверка возвращает True.
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# Старый способ
even = []
for num in numbers:
if num % 2 == 0:
even.append(num)
# С filter()
even = list(filter(lambda x: x % 2 == 0, numbers))
print(even) # [2, 4, 6, 8, 10]
Синтаксис
filter(функция_проверки, итерируемый_объект)
функция_проверки— должна возвращатьTrue/False- Возвращает объект
filter— оборачивай вlist(), чтобы получить список
Базовые примеры
Числа
numbers = [5, 12, 3, 18, 25, 7]
# Больше порога
above_10 = list(filter(lambda x: x > 10, numbers))
print(above_10) # [12, 18, 25]
# Положительные (с именованной функцией)
def is_positive(x):
return x > 0
mixed = [-5, 2, -3, 8, 0, -1, 10]
positive = list(filter(is_positive, mixed))
print(positive) # [2, 8, 10]
Строки
words = ["python", "javascript", "go", "java", "typescript"]
# Содержат "script"
with_script = list(filter(lambda w: "script" in w, words))
print(with_script) # ['javascript', 'typescript']
# Начинаются с "j"
starts_j = list(filter(lambda w: w.startswith("j"), words))
print(starts_j) # ['javascript', 'java']
Словари
students = [
{"name": "Алиса", "grade": 95},
{"name": "Боб", "grade": 67},
{"name": "Карл", "grade": 88},
{"name": "Дима", "grade": 72}
]
# Оценка >= 80
high_performers = list(filter(lambda s: s["grade"] >= 80, students))
for s in high_performers:
print(s["name"], s["grade"])
# Алиса 95
# Карл 88
# Провалили (< 70)
failed = list(filter(lambda s: s["grade"] < 70, students))
print([s["name"] for s in failed]) # ['Боб']
Множественные условия
numbers = [5, 12, 3, 18, 25, 7, 30]
# Чётные И больше 10
result = list(filter(lambda x: x % 2 == 0 and x > 10, numbers))
print(result) # [12, 18, 30]
# Меньше 10 ИЛИ больше 20
result = list(filter(lambda x: x < 10 or x > 20, numbers))
print(result) # [5, 3, 25, 7, 30]
Сложный пример
products = [
{"name": "Телефон", "price": 500, "in_stock": True},
{"name": "Ноутбук", "price": 1200, "in_stock": False},
{"name": "Мышь", "price": 25, "in_stock": True},
{"name": "Монитор", "price": 300, "in_stock": True}
]
# В наличии И цена < 600
affordable = list(filter(
lambda p: p["in_stock"] and p["price"] < 600,
products
))
for p in affordable:
print(f"{p['name']}: ${p['price']}")
# Телефон: $500
# Мышь: $25
# Монитор: $300
filter() vs List Comprehension
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# filter()
even_filter = list(filter(lambda x: x % 2 == 0, numbers))
# List comprehension
even_comp = [x for x in numbers if x % 2 == 0]
print(even_filter == even_comp) # True
filter() удобен, когда уже есть готовая функция-проверка:
def is_adult(person):
return person["age"] >= 18
adults = list(filter(is_adult, people))
Comprehension удобнее, когда нужно одновременно фильтровать и преобразовывать:
adult_names = [p["name"] for p in people if p["age"] >= 18]
Распространённые ошибки
Ошибка 1: Забыли list()
numbers = [1, 2, 3, 4, 5]
result = filter(lambda x: x > 2, numbers)
print(result) # <filter object at 0x...> — не список!
# ✅ ПРАВИЛЬНО
result = list(filter(lambda x: x > 2, numbers))
print(result) # [3, 4, 5]
Ошибка 2: filter(None) убирает 0
data = [0, 5, 10, 15]
# filter(None) уберёт 0!
result = list(filter(None, data))
print(result) # [5, 10, 15] ← 0 исчез
# Если 0 — валидное значение:
result = list(filter(lambda x: x is not None, data))
print(result) # [0, 5, 10, 15]
filter(None, data) удаляет все “ложные” значения: None, False, 0, "", [], {}.
filter() + map()
Сначала отбираем, потом преобразуем:
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# Чётные → удвоить
result = list(map(lambda x: x * 2, filter(lambda x: x % 2 == 0, numbers)))
print(result) # [4, 8, 12, 16, 20]
# То же через comprehension
result = [x * 2 for x in numbers if x % 2 == 0]
print(result) # [4, 8, 12, 16, 20]
💬 Комментарии (0)
Комментариев пока нет
Станьте первым, кто поделится мнением об этой статье!