filter(func, iterable)
bool
значение,Функция filter()
отбирает/фильтрует элементы переданного объекта iterable
при помощи пользовательской функции func
.
Функция filter()
принимает в качестве аргументов пользовательскую функцию и объект, элементы которого следует отфильтровать (может быть последовательностью или объектом поддерживающий итерирование).
func
вернёт False
, то элемент последовательности iterable
не попадёт в результат выполнения функции filter()
.func
вернет None
, то считается что требуется применить тождественное действие (item for item in iterable if item)
, таким образом все элементы, оцениваемые как False
будут отфильтрованы.Чтобы получить результат из элементов оцененных пользовательской функцией как False
, воспользуйтесь itertools.filterfalse()
.
Из всего сказанного можно сделать вывод, что для успешного использования функции filter()
необходимо в результате каких то вычислений/сравнений над каждым элементом передаваемой последовательности получать True
или 1 для элементов которые нужно отобрать и False
или 0 для элементов, которые нужно отбросить.
При несложных вычислениях фильтрации, легче всего такое поведение можно получить при помощи лямбда-функции, используя в них стандартные функции или методы, возвращающие bool
значения, операции сравнения, оператор вхождения in
и оператор идентичности is
.
Если необходимо произвести более сложные вычисления фильтрации, то для этого необходимо определить обычную функцию и передать ее в качестве первого аргумента функции filter()
.
# имеем числовую последовательность
num = [1, 2.0, 3.1, 4, 5, 6, 7.9]
# использование операции сравнения
# отбираем числа > 4
>>> f = filter(lambda x: x > 4, num)
>>> list(f)
# [5, 6, 7.9]
# использование оператора идентичности `is`
# отбираем только целые числа
>>> f = filter(lambda x: type(x) is int, num)
>>> list(f)
# [1, 4, 5, 6]
# теперь работаем со списком строк
num = ['ноль', '1', '2.0', '3.1', '4', '5', '7.9', 'семь']
# использование встроенных функций или методов
# возвращающих 'bool' значения на примере метода 'str.isdigit()'
# отбираем строки с записью чисел
>>> f = filter(lambda x: x.replace('.', '').isdigit(), num)
>>> list(f)
# ['1', '2.0', '3.1', '4', '5', '7.9']
# использование оператора вхождения `in`
# отбираем строки которые имеют вхождение
# символа точки '.'
>>> f = filter(lambda x: '.' in x, num)
>>> list(f)
# ['2.0', '3.1', '7.9']
num = list(range(0, 27))
# определяем отдельную функцию которая
# отбирает четные элементы > 18.
def ff(x):
if x > 18 and not x % 2:
return True
else:
return False
>>> f = filter(ff, num)
>>> list(f)
# [20, 22, 24, 26]