Использование filter() для фильтрации элементов списка в Python

Раздел: Основы Python -> Операции со списками

Фильтрация списка с помощью filter() в Python

Встроенная функция filter() позволяет отобрать элементы итерируемого объекта (например, списка) по заданному условию. Основной синтаксис:

filter(функция, итерируемый_объект)

Python list element (получение элемента списка в python)

Функция должна принимать один аргумент и возвращать True или False. filter() возвращает итератор, поэтому для получения списка его оборачивают в list().

Наиболее эффективный и лаконичный способ - использование лямбда-функции:

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

Python add to list (добавление элемента в список)

Этот подход подходит, когда условие простое и не требует переиспользования. Для сложной логики лучше вынести функцию отдельно.

Как отфильтровать список по условию без лямбды?

Если условие сложное или функция уже определена, передают её имя:

def is_positive(x):
    return x > 0

nums = [-2, -1, 0, 1, 2]
positives = list(filter(is_positive, nums))
print(positives)  # [1, 2]

Python copy list (копирование списка в python)

Это повышает читаемость кода, особенно если фильтрация используется многократно.

Как заменить filter() на list comprehension?

List comprehension часто является более Pythonic-способом и выполняется быстрее для простых условий:

numbers = [1, 2, 3, 4, 5, 6]
even_numbers = [x for x in numbers if x % 2 == 0]
print(even_numbers)  # [2, 4, 6]

Python list extend (метод extend для списка)

Однако filter() может быть эффективнее при работе с большими данными, так как возвращает итератор (экономит память). List comprehension сразу создаёт полный список.

Как отфильтровать список, удалив ложные значения?

Если передать в filter() None вместо функции, будут отобраны только элементы, которые в булевом контексте равны True:

data = [0, 1, '', 'abc', None, [], [1, 2]]
cleaned = list(filter(None, data))
print(cleaned)  # [1, 'abc', [1, 2]]

Python list reverse (реверс списка в python)

Это удобно для удаления пустых строк, нулей, None и пустых коллекций.

Как применить несколько условий в filter()?

Условия объединяются внутри функции:

nums = [10, 15, 20, 25, 30]
result = list(filter(lambda x: x > 10 and x < 25, nums))
print(result)  # [15, 20]

Python empty list (создание пустого списка)

Можно также использовать встроенные модули, например operator или functools.partial.

Как отфильтровать список по индексу элемента?

Сам filter() не передаёт индекс. Используют enumerate() вместе с filter():

items = ['a', 'b', 'c', 'd']
filtered = list(filter(lambda pair: pair[0] % 2 == 0, enumerate(items)))
result = [val for idx, val in filtered]
print(result)  # ['a', 'c']

Python list slice (срезы списков в python)

Или проще через list comprehension с enumerate.

Как отфильтровать список строк по шаблону (регулярные выражения)?

Используют модуль re внутри filter():

import re

words = ['cat', 'car', 'bat', 'bar', 'cart']
pattern = r'^ca'
result = list(filter(lambda w: re.match(pattern, w), words))
print(result)  # ['cat', 'car', 'cart']

Для частого использования лучше вынести функцию проверки.

Типичные ошибки и проблемы

  • filter() возвращает итератор, а не список. Забывают обернуть в list(). Приводит к тому, что результат нельзя проиндексировать или вывести сразу.
  • Ошибка TypeError. Если функция не принимает один аргумент или итерируемый объект не поддерживает итерацию.
  • Функция не возвращает bool. filter() интерпретирует возвращаемое значение как bool - любое ненулевое, непустое и т.д. считается True. Это может привести к неожиданным результатам, если функция возвращает, например, число.
  • Изменяемость и замыкания в лямбдах. Если лямбда использует переменную из внешней области, стоит быть осторожным с временем захвата (захват по ссылке).
  • Производительность. Для маленьких списков list comprehension обычно быстрее. filter() с лямбдой может быть медленнее из-за вызова Python-функции.

Решение: для критичных к скорости участков используйте list comprehension или генераторы. Для больших данных - filter() и итераторы, чтобы не хранить весь результат в памяти.

Цели и случаи использования каждого варианта

  • filter() с лямбдой - для быстрой однострочной фильтрации, когда условие простое и не нужно переиспользование.
  • filter() с именованной функцией - когда условие сложное, логично вынести в отдельную функцию для читаемости и тестирования.
  • list comprehension - предпочтительный способ в большинстве случаев, когда требуется сразу список; более читаемый и часто быстрее.
  • filter(None, ...) - для быстрой очистки от „ложных“ значений.
  • filter() с re - для фильтрации строк по регулярному выражению.
- Python добавить элемент в массив (добавление элемента в конец списка (append) в python)
- элемент двумерного массива python (доступ к элементу двумерного массива (списка списков) в python)
- Python обратиться к элементу списка (обращение к элементу списка по индексу в python)

Расширенные примеры фильтрации списков

1. Фильтрация чисел с плавающей точкой, проверка на конечность:

Пример
import math
nums = [1.0, float('inf'), 2.5, float('nan'), 3.0]
finite = list(filter(math.isfinite, nums))
print(finite)  # [1.0, 2.5, 3.0]

2. Фильтрация списка словарей по значению ключа:

Пример
users = [
    {'name': 'Alice', 'age': 25},
    {'name': 'Bob', 'age': 17},
    {'name': 'Charlie', 'age': 30}
]
adults = list(filter(lambda u: u['age'] >= 18, users))
print(adults)
# [{'name': 'Alice', 'age': 25}, {'name': 'Charlie', 'age': 30}]

3. Фильтрация с помощью functools.partial для передачи дополнительных аргументов:

Пример
from functools import partial

def greater_than(threshold, value):
    return value > threshold

nums = [1, 5, 10, 15, 20]
over_ten = list(filter(partial(greater_than, 10), nums))
print(over_ten)  # [15, 20]

4. Комбинирование filter() и map() для преобразования и фильтрации:

Пример
nums = [1, 2, 3, 4, 5]
result = list(map(lambda x: x * 2, filter(lambda x: x > 2, nums)))
print(result)  # [6, 8, 10]

5. Фильтрация с сохранением порядка и удалением дубликатов (при этом порядок важен):

Пример
def unique_filter(seq):
    seen = set()
    for item in seq:
        if item not in seen:
            seen.add(item)
            yield item

nums = [1, 2, 2, 3, 1, 4]
unique = list(filter(lambda x: True, unique_filter(nums)))
print(unique)  # [1, 2, 3, 4]
# Но проще: list(dict.fromkeys(nums))

6. Фильтрация с проверкой типа элемента:

Пример
mixed = [1, 'hello', 3.14, None, [1, 2], 'world']
strings = list(filter(lambda x: isinstance(x, str), mixed))
print(strings)  # ['hello', 'world']

7. Использование filter() с генератором для работы с большими данными без создания промежуточного списка:

Пример
def generate_numbers(n):
    for i in range(n):
        yield i

# фильтр возвращает итератор, который можно передать в другой итератор
large = filter(lambda x: x % 2 == 0, generate_numbers(10**5))
# берём только первые 5 элементов
import itertools
first_five = list(itertools.islice(large, 5))
print(first_five)  # [0, 2, 4, 6, 8]

8. Обработка None и пустых значений при фильтрации вложенных структур:

Пример
data = [{'value': 1}, {'value': None}, {'value': 0}, {}, {'value': 2}]
filtered = list(filter(lambda d: d.get('value') is not None, data))
print(filtered)  # [{'value': 1}, {'value': 0}, {'value': 2}]

Фильтрация списка с помощью filter - comments

En
Python filter list (python)