Python filter all синтаксис

Как работает функция filter() в Python

Python вот уже который год занимает первые места среди самых популярных языков программирования. По рейтингу от TIOBE Software в 2021 году Python занял первое место по популярности. Конечно, столь популярный язык используется и при работе во всех современных облачных сервисах, в том числе и в cloud.timeweb.com . В сегодняшней статье мы расскажем о применении функции Python – filter(), являющейся одной из самых важных в этом языке программирования.

Filter() – это функция встроенная в стандартный Python, т.е. не требует импорта библиотек.

Синтаксис

На вход подается 2 параметра – функция и итерируемый объект.

function – функция с одним аргументом. Именно по ней фильтруются значения.

Итерируемый объект “iterable” может содержать любую итерацию – список, кортеж, словарь и т.д. Также может содержать объекты генератора или итератора. Filter() принимает только один итерируемый объект.

Механизм работы следующий: функция filter() разбивает переданный итерируемый объект на элементы и передает каждый их них в функцию (function), которая возвращает значение (True, False или что-то другое: число, строка и т.д.). Filter оценивает полученное значение и, если оно True (не именно равно ‘True’, а вообще истинно), добавляет его в итератор, если нет, то нет. Результатом работы является объект — итератор, содержащий только элементы, которые при фильтрации получили значение True.

Читайте также:  Php str replace encoding

Чтобы получить значения, которые были оценены как False, используется функция:

Функция filter Python более эффективна по времени выполнения, чем цикл for, через который тоже можно сделать фильтрацию. Другим преимуществом является то, что функция filter возвращает итератор, что является более эффективным использованием памяти. Это было введено для filter в python 3 . В версии python 2 функция фильтр возвращает объект типа list.

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

Применение filter() с пользовательской функцией

Одним из самых простых примеров является фильтр четных чисел.

numbers = [1, 2, 3, 4, 5, 7, 10, 11]def filter_num(num):
if(num % 2) != 0:
return True
else:
return False
out_filter = filter(filter_num, numbers)
print("Отфильтрованный список: ", list(out_filter))

В данном случае мы передаем в filter() пользовательскую функцию (filter_num) и список чисел — numbers.

Отфильтрованный список: [1, 3, 5, 7, 11]

Наша пользовательская функция проверяет каждый элемент списка на нечетность. Для этого, как мы знаем, должен быть ненулевой остаток при делении на 2. В случае если число нечетное, функция возвращает True, а значит этот элемент попадает в итоговый итератор.

Так как функция filter() возвращает объект с типом — , для получения самого результата необходимо преобразовать вывод. Например, мы преобразовали его в объект типа list (список). Этот пример возможно также реализовать с использованием лямбда-функции:

filter(lambda n: n % 2 != 0, numbers)

Следующий пример работы позволяет найти пересечение двух массивов .

arr1 = ['1', '2', '3', '4', 5, 6, 7]arr2 = [1, '2', 3, '4', '5', '6', 7]

Пишем функцию для поиска пересечений:

def intersection(arr1, arr2): 
out = list(filter(lambda it: it in arr1, arr2))
return out

Она принимает на вход 2 массива, которые нужно проверить. После этого с помощью лямбда-функции находятся общие элементы.

Вызов функции и вывод результата:

out = intersection(arr1, arr2)
print("Отфильтрованный список:", out)
Отфильтрованный список: ['2', '4', 7]

Применение filter() с лямбда-функцией

Функция filter также может принимать на вход лямбда-функции. Например, создадим детектор палиндромов:

word = ["cat", "rewire", "level", "book", "stats", "list"]palindromes = list(filter(lambda word: word == word[::-1], word))
print("Слова палиндромы: ", list(palindromes))
Слова палиндромы: ['level', 'stats']

Лямбда-функция проверяет, равно ли слово самому себе, написанному наоборот. Если это так, то возвращает True.

Применение filter() с фильтрацией выбросов в выборке

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

import statistics as st
sample = [10, 8, 10, 8, 2, 7, 9, 3, 34, 9, 5, 9, 25]
mean = st.mean(sample)
mean: 10.69

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

stdev = st.stdev(sample)
low = mean - 2*stdev
high = mean + 2*stdev

Находим стандартное отклонение, верхнюю и нижнюю границы. Затем фильтруем нашу выборку:

clean_sample = list(filter(lambda x: low 
[10, 8, 10, 8, 2, 7, 9, 3, 9, 5, 9, 25]

Очевидно, что значение 34 было выбросом. Теперь наше среднее значение равно: 8.75

Если провести еще одну итерацию данного метода, то значение 25 будет также отфильтровано.

Выборка без выбросов: [10, 8, 10, 8, 2, 7, 9, 3, 9, 5, 9]

Среднее значение 7.273 имеет значительную разницу с первоначальным.

Работа с None

Чтобы разобраться, как filter() работает с None, рассмотрим следующий пример:

list_ = [0, 1, 'Hello', '', None, [], [1,2,3], 0.1, 0.0, False]print(list(filter(None, list_)))

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

В данном случае результатом работы будет список:

Мы видим, что такие элементы как 0, [], None, », False были отфильтрованы, так как они являются элементами с нулевой длиной или численно равными 0, а значит являются ложными.

Применение filter() со списком словарей

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

Возьмём список книг в книжном магазине:

Отфильтруем книги по цене. Напишем функцию, которая получит все книги, которые стоят больше 500:

def cost(book): 
if book["Price"] > 500:
return True
else:
return False

Тут все просто, функция проверяет стоимость каждой книги и возвращает True, если она удовлетворяет условию.

Выведем названия книг через цикл for:

filtered_object = filter(cost, books)
for row in filtered_object:
print(dict(row)["Title"])
Angels and Demons
Harry Potter and the Philosophers Stone

Фильтрация значений NaN

Предположим, что у нас есть выборка:

sample = [10.1, 8.3, 10.4, 8.8, float("nan"), 7.2, float("nan")]

В случае если мы захотим вычислить что-либо по такой выборке, например, среднее значение или отклонение, мы получим nan (не число).

Значения NaN могут появляться по разным причинам. Одной из альтернатив может быть их удаление из данных.

Воспользуемся для этого функцией isnan() из модуля math. Данная функция принимает число в качестве аргумента и возвращает логическое значение True, если это значение NaN, и False в обратном случае.

Так как функция filter добавляет в итератор элементы, которые получили значение функции True, мы в итоге получим только значения NaN. Чтобы это исправить напишем функцию, которая будет «разворачивать» результат функции isnan():

import math
import statistics as st
sample = [10.1, 8.3, 10.4, 8.8, float("nan"), 7.2, float("nan")]def searcnan(x):
if math.isnan(x):
return False
else: return True
st.mean(filter(searcnan, sample))

То в результате получим 8.96.

В этом случае возможно поступить проще и вызвать функцию filterfalse(). Она такая же, как filter, но оставляет элементы с значением False:

from itertools import filterfalse
st.mean(filterfalse(math.isnan, sample))

Результат аналогичный: 8.96.

Заключение

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

Источник

Функция filter() в Python: синтаксис, описание и примеры использования

Функция filter() в Python: синтаксис, описание и примеры использования

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

Синтаксис функции filter()

Синтаксис функции выглядит следующим образом:

где function — это функция, которая будет применяться к каждому элементу iterable , а iterable — это последовательность, которую необходимо отфильтровать.

function должна быть функцией, которая возвращает булево значение ( True или False ) в зависимости от того, должен ли элемент быть включен в результирующую последовательность. Эта функция может быть передана в качестве аргумента или определена как lambda-функция.

Примеры использования функции filter()

Использование filter() с лямбда-функцией

Пример использования filter() с лямбда-функцией для фильтрации четных чисел из списка:

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

В этом примере, функцией-условием является лямбда-функция lambda x: x % 2 == 0 , которая проверяет, является ли число четным (остаток от деления на 2 равен 0). Функция-условие передается в filter() в качестве первого аргумента, а список numbers в качестве второго аргумента. filter() возвращает новый итерируемый объект, содержащий только четные числа из исходного списка. Мы затем преобразуем этот итерируемый объект в список, с помощью функции list() , и выводим результат.

Использование filter() с пользовательской функцией

Сделаем тоже самое, что и в примере выше, но с пользовательской функцией:

def is_even(num): """ Функция проверяет, является ли число четным. """ return num % 2 == 0 numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] # использование функции filter() для фильтрации четных чисел из списка numbers filtered_numbers = list(filter(is_even, numbers)) print(filtered_numbers) #[2, 4, 6, 8, 10]

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

Использование filter() со списком словарей

Для использования функции filter() со списком словарей можно передать функцию-условие и список словарей в качестве аргументов.

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

people = [, , , ] def age_less_than_30(person): return person['age'] <= 30 filtered_people = list(filter(age_less_than_30, people)) #[, ]

Плюсы и минусы функции filter()

  • Функция filter() позволяет быстро и удобно выбрать элементы из последовательности на основе заданного условия.
  • Можно использовать как встроенную функцию, так и определить свою собственную функцию для отбора элементов.
  • Результатом работы функции является новая последовательность, что позволяет сохранить исходную последовательность в неизменном виде.
  • Использование lambda-функций может привести к усложнению кода и ухудшению его читаемости.
  • Если последовательность очень большая, то создание новой последовательности может привести к увеличению объема памяти, потребляемого программой.

Советы по работе с функцией

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

Заключение

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

Как правильно именовать функции в Python

Как правильно именовать функции в Python

Статические методы (staticmethod) в Python: что это и зачем

Статические методы (staticmethod) в Python: что это и зачем

reverse() и reversed() в Python: как работают и в чем их различия

reverse() и reversed() в Python: как работают и в чем их различия

Основные способы определения палиндрома в строке на языке Python

Основные способы определения палиндрома в строке на языке Python

Функция exec() в Python: как работает и примеры

Функция exec() в Python: как работает и примеры

Метод __getitem__() в Python: описание и примеры

Метод __getitem__() в Python: описание и примеры

Источник

Оцените статью