Python вот уже который год занимает первые места среди самых популярных языков программирования. По рейтингу от TIOBE Software в 2021 году Python занял первое место по популярности. Конечно, столь популярный язык используется и при работе во всех современных облачных сервисах, в том числе и в timeweb.cloud. В сегодняшней статье мы расскажем о применении функции Python – filter(), являющейся одной из самых важных в этом языке программирования.
Filter() – это функция встроенная в стандартный Python, т.е. не требует импорта библиотек.
Синтаксис
На вход подается 2 параметра – функция и итерируемый объект.
function – функция с одним аргументом. Именно по ней фильтруются значения.
Итерируемый объект “iterable” может содержать любую итерацию – список, кортеж, словарь и т.д. Также может содержать объекты генератора или итератора. Filter() принимает только один итерируемый объект.
Механизм работы следующий: функция filter() разбивает переданный итерируемый объект на элементы и передает каждый их них в функцию (function), которая возвращает значение (True, False или что-то другое: число, строка и т.д.). Filter оценивает полученное значение и, если оно True (не именно равно ‘True’, а вообще истинно), добавляет его в итератор, если нет, то нет. Результатом работы является объект — итератор, содержащий только элементы, которые при фильтрации получили значение True.
Чтобы получить значения, которые были оценены как False, используется функция:
Функция filter Python более эффективна по времени выполнения, чем цикл for, через который тоже можно сделать фильтрацию. Другим преимуществом является то, что функция filter возвращает итератор, что является более эффективным использованием памяти. Это было введено для filter в python 3. В версии python 2 функция фильтр возвращает объект типа list.
Разобрав основы функции, давайте посмотрим, как работает filter() на различных примерах.
Применение filter() с пользовательской функцией
Одним из самых простых примеров является фильтр четных чисел.
В данном случае мы передаем в filter() пользовательскую функцию (filter_num) и список чисел - numbers.
Результатом работы будет:
Наша пользовательская функция проверяет каждый элемент списка на нечетность. Для этого, как мы знаем, должен быть ненулевой остаток при делении на 2. В случае если число нечетное, функция возвращает True, а значит этот элемент попадает в итоговый итератор.
Так как функция filter() возвращает объект с типом - <class 'filter'>, для получения самого результата необходимо преобразовать вывод. Например, мы преобразовали его в объект типа list (список). Этот пример возможно также реализовать с использованием лямбда-функции:
Следующий пример работы позволяет найти пересечение двух массивов.
Входные данные:
Пишем функцию для поиска пересечений:
Она принимает на вход 2 массива, которые нужно проверить. После этого с помощью лямбда-функции находятся общие элементы.
Вызов функции и вывод результата:
Результат работы:
Облачные серверы
по всему миру с почасовой оплатой.
Применение filter() с лямбда-функцией
Функция filter также может принимать на вход лямбда-функции. Например, создадим детектор палиндромов:
Код:
Результат выполнения:
Лямбда-функция проверяет, равно ли слово самому себе, написанному наоборот. Если это так, то возвращает True.
Применение filter() с фильтрацией выбросов в выборке
Импортируем библиотеку для статистических вычислений и задаем нормально распределенную выборку с несколькими выбросами.
Найдем среднее значение:
В выборках с нормальным распределением зачастую выбросы определяются как значения, которые отличаются от среднего более чем на 2 стандартных отклонения.
Находим стандартное отклонение, верхнюю и нижнюю границы. Затем фильтруем нашу выборку:
Результат работы:
Очевидно, что значение 34 было выбросом. Теперь наше среднее значение равно: 8.75
Если провести еще одну итерацию данного метода, то значение 25 будет также отфильтровано.
Среднее значение 7.273 имеет значительную разницу с первоначальным.
Работа с None
Чтобы разобраться, как filter() работает с None, рассмотрим следующий пример:
Если в качестве функции в filter() передается None, то будут отфильтрованы все элементы, которые имеют логическое значение False (являются ложными сами по себе).
В данном случае результатом работы будет список:
Мы видим, что такие элементы как 0, [], None, '', False были отфильтрованы, так как они являются элементами с нулевой длиной или численно равными 0, а значит являются ложными.
Применение filter() со списком словарей
Функция также может работать с более сложными структурами данных. Например, у нас есть список словарей, и мы хотим выполнять итерации не только по каждому элементу в списке, но и по каждой паре ключ-значение в этом словаре.
Возьмём список книг в книжном магазине:
Отфильтруем книги по цене. Напишем функцию, которая получит все книги, которые стоят больше 500:
Тут все просто, функция проверяет стоимость каждой книги и возвращает True, если она удовлетворяет условию.
Выведем названия книг через цикл for:
Результат:
Фильтрация значений NaN
Предположим, что у нас есть выборка:
В случае если мы захотим вычислить что-либо по такой выборке, например, среднее значение или отклонение, мы получим nan (не число).
Значения NaN могут появляться по разным причинам. Одной из альтернатив может быть их удаление из данных.
Воспользуемся для этого функцией isnan() из модуля math. Данная функция принимает число в качестве аргумента и возвращает логическое значение True, если это значение NaN, и False в обратном случае.
Так как функция filter добавляет в итератор элементы, которые получили значение функции True, мы в итоге получим только значения NaN. Чтобы это исправить напишем функцию, которая будет «разворачивать» результат функции isnan():
Теперь, если мы вызовем
То в результате получим 8.96.
В этом случае возможно поступить проще и вызвать функцию filterfalse(). Она такая же, как filter, но оставляет элементы с значением False:
Результат аналогичный: 8.96.
Подготовили для вас выгодные тарифы на облачные серверы
477 ₽/мес
657 ₽/мес
Заключение
Рассмотренная сегодня функция filter Python, как вы могли убедиться, может иметь множество разных применений. Мы рассмотрели основные из них. В процессе творческой работы вы сможете найти много других способов, как воспользоваться этой крутой функцией.
