Зарегистрируйтесь, чтобы продолжить обучение

Фильтрация (filter) Python: Функции

Понятие "фильтрация" интуитивно понятно каждому человеку. Мы пьём фильтрованную воду и фильтруем то, что говорим. В программировании практически то же самое. Операция "фильтрация" по отношению к коллекции означает, что мы отбираем из неё только те элементы, которые удовлетворяют нужному условию. Типичная задача может выглядеть так — выбрать пользователей старше 10 лет:

users = [
  { 'name': 'Igor', 'age': 19 },
  { 'name': 'Danil', 'age': 1 },
  { 'name': 'Vovan', 'age': 4 },
  { 'name': 'Matvey', 'age': 16 },
]

result = []
for user in users:
  if user['age'] > 10:
    result.append(user)

print(result)
# => [ { 'name': 'Igor', 'age': 19 }, { 'name': 'Matvey', 'age': 16 } ]

Фильтрация встречается так же часто как отображение. Общая схема кода при фильтрации практически один в один как и в отображении, кроме пары ключевых моментов:

  • Фильтрация возвращает коллекцию либо того же размера, если ничего не было отфильтровано, либо меньшего. Она может вернуть даже пустую коллекцию, если ни один из элементов не подошёл.
  • Фильтрация всегда возвращает исходные элементы. Она никогда не делает отображение. Если на вход фильтрации поступил список пользователей, то список пользователей будет и на выходе.

Теперь посмотрим, как выглядит фильтрация при использовании встроенной функции высшего порядка filter():

filtered_users = filter(lambda user: user['age'] > 10, users)
print(filtered_users) # <filter at 0x71de32b28040>

list(filtered_users) # => [{'name': 'Igor', 'age': 19}, {'name': 'Matvey', 'age': 16}]

Функция, передаваемая в filter(), должна быть предикатом. То есть её задача вернуть либо True, либо False для каждого элемента коллекции. Значение, которое возвращается, никак не используется — оно всего лишь говорит о том, включать ли текущий элемент или нет. Новички часто делают ошибку на этом этапе и начинают возвращать из фильтра то, что они бы хотели увидеть в результате, а для этого надо применять map().

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

Реализация

Напишем свою собственную функцию my_filter(), работающую аналогично встроенной filter():

def my_filter(callback, collection):
  for item in collection:
    # Предикат используется только для проверки
    # Внутрь callback по очереди передается каждый элемент коллекции collection
    if callback(item):
      # Реализуем ленивость
      yield item

users = [
  { 'name': 'Igor', 'age': 19 },
  { 'name': 'Danil', 'age': 1 },
  { 'name': 'Vovan', 'age': 4 },
  { 'name': 'Matvey', 'age': 16 },
]

filtered_users = my_filter(lambda user: user['age'] > 10, users)
list(filtered_users) # [{'name': 'Igor', 'age': 19}, {'name': 'Matvey', 'age': 16}]

Дополнительные материалы

  1. Функция filter

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы
профессия
от 25 000 ₸ в месяц
Разработка веб-приложений на Django
10 месяцев
с нуля
Старт 26 декабря

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»
Изображение Тото

Задавайте вопросы, если хотите обсудить теорию или упражнения. Команда поддержки Хекслета и опытные участники сообщества помогут найти ответы и решить задачу