Рубріки: Теория

Функция Filter для Python — как устроена и зачем нужна

Андрей Галадей

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

Содержание:
1. Что такое Filter для Python
2. Синтаксис Filter для Python
3. Примеры функции filter()
4. Фильтр нечетных чисел
5. Фильтр повторяющихся значений из двух списков
6. Использование лямбда-выражений с filter()
7. Отфильтровать стоп-слова из строки
8. Пересечение двух массивов
9. Функция filter без функции
Заключение

1. Что такое Filter для Python

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

Идея состоит в том, чтобы отфильтровать последовательность по критерию true/false. В результате создается дочерняя последовательность, куда попадают только элементы, которые имеют значение true. Это позволяет легко размежевать истинные и ложные значения, после чего обрабатывать их так, как нужно.

Теперь давайте перейдем к синтаксису Filter.

2. Синтаксис Filter для Python

Рассмотрим, какими будут синтаксические конструкции для filter(). Синтаксис функции filter() выглядит следующим образом:

filter(function, iterable or sequence)

Давайте разберем все по порядку. На вход функции подается два параметра: функция (не путать с функцией filter ()) и итерацию.

Функция проверяет истинность или ложность каждого элемента последовательности.

Итерация (последовательность) — то, что нам нужно проверить с помощью функции. К примеру, там может быть последовательность чисел, которые нужно проверить по условию — они больше или меньше 10. Если у нас истинным будет условие «меньше 10», то все числа, которые больше — отфильтруются как false, а в новую дочернюю итерацию попадут только с условием «меньше 10» или true (как в данным случае).

Функция filter() эквивалентна такой конструкции:

# when function is defined 
(element for element in iterable if function(element)) 
# when function is None 
(element for element in iterable if element)

На выходе filter() возвращает отфильтрованную последовательность, которая содержит новую последовательность, но уже содержащую только true-значения. Пока все просто, не правда ли?

3. Примеры функции filter()

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

4. Фильтр нечетных чисел

Самый простой пример. На выход подается список чисел. Он выглядит так:

numbers = [1, 2, 4, 5, 7, 8, 10, 11]

Есть функция, которая выбирает из него только нечетные числа. А они, как мы помним, не делятся на 2 без остатка (или с остатком 0, если хочется более корректного математического условия).

Она передается в виде первого аргумента для функции (или, если хотите, вызова) filter().

# функция, которые фильтрует только нечетные числа
def filter_odd_num(in_num):
    if(in_num % 2) == 0:
        return True
    else:
        return False

Теперь рассмотрим финальный код:

# список чисел
numbers = [1, 2, 4, 5, 7, 8, 10, 11]
# функция, которая проверяет числа на нечетность
def filter_odd_num(in_num):
    if(in_num % 2) == 0:
        return True
    else:
        return False
# Удаление нечетных чисел с помощью filter() для удаления нечетных чисел
out_filter = filter(filter_odd_num, numbers)
print("Тип объекта out_filter: ", type(out_filter))
print("Отфильтрованный список: ", list(out_filter))

Результат будет примерно таким:

Тип объекта out_filter: <class ‘filter’>
Отфильтрованный список: [2, 4, 8, 10]

То есть, функция выведет в результирующую последовательность четные числа. Отметим пару моментов:

  1. Функция filter()вернет переменную out_filter, для проверки типа данных используется функция type().
  2. Функция list() используется для преобразования filter в список.

Как видите, ничего сложного. Переходим к следующему примеру.

5. Фильтр повторяющихся значений из двух списков

В этом разделе мы попробуем отфильтровать повторяющиеся значения из двух списков.

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

# Список строк с дубликатами
list1 = ["Python", "CSharp", "Java", "Go"]
list2 = ["Python", "Scala", "JavaScript", "Go", "PHP", "CSharp"]

Как видим, там есть повторяющиеся элементы — Python, CSharp и Go. Нужно, чтобы функция выбрала элементы, которые не повторяются.

# проверка строк на вхождение
def filter_duplicate(string_to_check):
    if string_to_check in ll:
        return False
    else:
        return True

А вот так выглядит готовая программа:

# Список строк с дубликатами элементами
list1 = ["Python", "CSharp", "Java", "Go"]
list2 = ["Python", "Scala", "JavaScript", "Go", "PHP", "CSharp"]
# функция, которая проверяет строки на вхождение
def filter_duplicate(string_to_check):
    if string_to_check in ll:
        return False
    else:
        return True
# filter() удаляет повторяющиеся строки
ll = list2
out_filter = list(filter(filter_duplicate, list1))
ll = list1
out_filter += list(filter(filter_duplicate, list2))
print("Отфильтрованный список:", out_filter)

На выходе будет такой результат:

Отфильтрованный список: [‘Java’, ‘Scala’, ‘JavaScript’, ‘PHP’]

Разумеется, функцию можно усложнить, если добавить вывод с разбиением по строкам. То есть, чтобы программа показывала из какой строки взято неповторяющееся значение. Но это уже выходит за рамки данной статьи.

А теперь перейдем к чему-то более сложному.

6. Использование лямбда-выражений с filter()

Ламбда-выражения — еще одна встроенная конструкция в Python. Она позволяет избавиться от отдельной функции для фильтрации. В этом случае код будет куда более компактным.

7. Отфильтровать стоп-слова из строки

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

Список стоп-слов выглядит так:

list_of_stop_words = ["в", "и", "по", " из"]

А вот так выглядит строка, которая включает эти стоп-слова:

string_to_process = "Сервис по продаже товаров Avito опубликовал официальное заявление по поводу флэшмоба, который устроили пользователи из России. Он касается перекупщиков видеокарт. Пользователи публикуют фейковые объявления, в которых нет реальных устройств."

Полный код:

list_of_stop_words = ["в", "и", "по", " из"]
string_to_process = "Сервис по продаже товаров Avito опубликовал официальное заявление по поводу флэшмоба, который устроили его пользователи. Он касается перекупщиков видеокарт. Пользователи публикуют фейковые объявления, у продавцов которых нет реальных устройств."
# лямбда-функция для фильтрации стоп-слов
split_str = string_to_process.split()
filtered_str = ' '.join((filter(lambda s: s not in list_of_stop_words, split_str)))
print("Отфильтрованная строка:a", filtered_str)

Результат будет таким:

Отфильтрованная строка: Сервис продаже товаров Avito опубликовал официальное заявление поводу флэшмоба, который устроили его пользователи. Он касается перекупщиков видеокарт. Пользователи публикуют фейковые объявления, у продавцов которых нет реальных устройств.

Схема работы проста — программа разбивает строку на слова (пробел значим, по нему и идет разбивка на слова), после чего «выкусывает» стоп-слова, заданные выше.

Если в качество стоп-слов указать другие слова, то система уберет их. Важно, в тексте и в списке стоп-слов должны быть одинаковых слова. То есть, если задать «Украина» в именительном падеже, то даже при наличии стоп-слова «Украины» система не отфильтрует его.

Как видите, использование лямбда-выражений позволит упростить код.

8. Пересечение двух массивов

Еще один пример работы, но теперь с массивами.

Здесь мы снова используем лямбда-выражение, после чего отфильтруем данные, чтобы найти в них общие элементы.

Входные данные выглядят так:

# Два массива, которые включают в себя некоторое количество общих элементов
arr1 = ['p','y','t','h','o','n',' ','3','.','0']
arr2 = ['p','y','d','e','v',' ','2','.','0']

Теперь создаем лямбда-функцию, которая позволит отфильтровать данные из массивов.

Выглядит она так:

# Лямбда-функция с использованием filter() для поиска общих значений
out = list(filter(lambda it: it in arr1, arr2))

Полная версия кода:

# Два массива, которые включают в себя некоторое количество общих элементов
arr1 = ['p','y','t','h','o','n',' ','3','.','0']
arr2 = ['p','y','d','e','v',' ','2','.','0']
# Лямбда-функция с использованием filter() для поиска общих значений
def interSection(arr1, arr2): # find identical elements
   out = list(filter(lambda it: it in arr1, arr2))
   return out
# функция main
if __name__ == "__main__":
   out = interSection(arr1, arr2)
   print("Отфильтрованный список:", out)

На выходе мы получим вот такой результат:

Отфильтрованный список: [‘p’, ‘y’, ‘ ‘, ‘.’, ‘0’]

Наконец, рассмотрим еще один вариант применения функции filter.

9. Функция filter без функции

В этом примере мы не будем передавать функцию filter() какую-либо функцию в роли первого аргумента. В этом случае нужно в явном виде указать None, иначе будет ошибка. Сама же функция filter() отработает и уберет элементы, результат которых равен False.

К примеру, мы подаем на вход такую строку:

# Перечень булевых значений, которые могут принимать вид True или False
bools = ['bool', 0, None, True, False, 1-1, 2%2]

А вот так выглядит полный код с filter() и None в качестве функции-аргумента:

# Перечень булевых значений, которые могут принимать вид True или False
bools = ['bool', 0, None, True, False, 1, 1-1, 2%2]
# Передаем None вместо функции в filter()
out = filter(None, bools)
# Вывод результата
for iter in out:
    print(iter)

А вот так выглядит результат исполнения:

bool
True
1

Как видите, ничего сложного.

Заключение

Мы рассмотрели основные методы использования функции filter(). Как оказалось, ее можно использовать для гибкой выборки (фильтрации) данных из строк и массивов, что дает возможность применять ее для разных задач.

Более продвинутый пример работы функции можно посмотреть на видео ниже:

Останні статті

Обучение Power BI – какие онлайн курсы аналитики выбрать

Сегодня мы поговорим о том, как выбрать лучшие курсы Power BI в Украине, особенно для…

13.01.2024

Work.ua назвал самые конкурентные вакансии в IТ за 2023 год

В 2023 году во всех крупнейших регионах конкуренция за вакансию выросла на 5–12%. Не исключением…

08.12.2023

Украинская IT-рекрутерка создала бесплатный трекер поиска работы

Unicorn Hunter/Talent Manager Лина Калиш создала бесплатный трекер поиска работы в Notion, систематизирующий все этапы…

07.12.2023

Mate academy отправит работников в 10-дневный оплачиваемый отпуск

Edtech-стартап Mate academy принял решение отправить своих работников в десятидневный отпуск – с 25 декабря…

07.12.2023

Переписки, фото, история браузера: киевский программист зарабатывал на шпионаже

Служба безопасности Украины задержала в Киеве 46-летнего программиста, который за деньги устанавливал шпионские программы и…

07.12.2023

Как вырасти до сеньйора? Девелопер создал популярную подборку на Github

IT-специалист Джордан Катлер создал и выложил на Github подборку разнообразных ресурсов, которые помогут достичь уровня…

07.12.2023