Как использовать функцию filter() в Python

Узнайте, как использовать функцию Python filter() для извлечения элементов из коллекций. Сравните фильтр со списками и лямбда-обратными вызовами.

Попробуйте это решение в редакторе

Обзор

Фильтрация данных — основная задача прикладного программирования. Часто вам придется выполнять поиск по списку и извлекать элементы, соответствующие определенным критериям, например извлечение активных пользователей из базы данных профилей или фильтрацию отрицательных чисел из журналов датчиков. Для этой цели Python предоставляет встроенный функциональный инструмент под названием filter().

Функция filter(function, iterable) принимает в качестве аргументов функцию фильтрации и итерируемый объект. Аргумент функции должен возвращать логическое значение («True» или «False») для каждого элемента. Функция filter() оценивает каждый элемент, сохраняя только те, которые имеют значение True, и возвращает объект-итератор (объект filter), содержащий результаты.

Как и `map()`, `filter()` лениво оценивает элементы. Если вам срочно нужен стандартный список, вы преобразуете вывод с помощью конструктора list(): list(filter(func, data))`. Если вы передадите None в качестве параметра функции (например, filter(None, data)), Python автоматически отфильтрует все ложные элементы, что является отличным способом очистки пустых значений.

Код и вывод выполнения

Этот скрипт демонстрирует фильтрацию числовых массивов, извлечение элементов словаря и отбрасывание ложных пустых строк с помощью filter().

numbers = [-5, -2, 0, 3, 8, -1]

# 1. Filter positive numbers using a lambda function
positives = list(filter(lambda x: x > 0, numbers))
print("Positives only:", positives)

# 2. Filter list of strings by character length
words = ["cat", "elephant", "dog", "giraffe"]
long_words = list(filter(lambda w: len(w) > 4, words))
print("Words longer than 4 chars:", long_words)

# 3. Shorthand: Remove all falsy values from a list by passing None
mixed_data = ["hello", "", "world", None, False, "active"]
clean_data = list(filter(None, mixed_data))
print("Falsy values removed:", clean_data)
Терминальный выход
Positives only: [3, 8]
Words longer than 4 chars: ['elephant', 'giraffe']
Falsy values removed: ['hello', 'world', 'active']

Пошаговая реализация

  • Определите функцию, которая принимает элемент и возвращает логическое значение, представляющее критерии фильтра.
  • Вызовите filter(function, iterable), чтобы создать ленивый итератор совпадений.
  • Приведите полученный объект фильтра к списку, используя list(filter(...)) если вам нужно манипулировать записями.
  • Передайте None в качестве аргумента функции, чтобы отфильтровать все ложные значения (например, None, 0 и пустые строки).

Часто задаваемые вопросы

Что произойдет, если функция, переданная в filter(), не вернет логическое значение?

Python оценивает достоверность возвращаемого значения. Если значение оценивается как True в логическом контексте, элемент сохраняется.

Должен ли я использовать фильтр() или понимание списка?

Понимание списка с условием if (например, [x для x в списке if условие]) часто предпочтительнее для удобства чтения, но filter() является чистым и высокопроизводительным, особенно при использовании существующих встроенных функций.

Связанные темы

Рекомендуемые ресурсы Python

Расширьте свои знания с помощью соответствующих интерактивных руководств, шпаргалок и сравнений кода.