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()
.
False
, None
, 0 и '') из списка с помощью 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]
False
, None
, 0 и '') из списка с помощью filter()
.>>> lst = [0, 1, False, 2, '', 3, 'a', 's', 34] >>> list(filter(None, lst)) # [1, 2, 3, 'a', 's', 34]