Функция filter()
принимает за аргумент функцию к итерируемому объекту, это может быть список, строка, словарь, множество и т.д, затем функция отфильтровывает элементы итерации.
Синтаксис:
filter(func, iterable)
Аргументы:
func
— функция, которая принимает элемент фильтруемого объекта и должна возвращать логическое (bool) значение,iterable
— последовательность или объект, который поддерживает итерацию.
Если функция func
filter
возвращает False
, то элемент итерируемой последовательности не будет включен в результат функции filter()
.
Если функция фильтра func
возвращает None
, то мы считаем, что требуется идентичное действие (элемент для элемента в итерации, если элемент), поэтому все элементы, оцененные как False
, будут отфильтрованы.
Чтобы получить результат из элементов оцененных пользовательской функцией как False
, воспользуйтесь itertools.filterfalse()
.
Пример:
Давайте определим функцию, чтобы проверить, четное ли число на входе, или нет. Функция вернет True
, если число четное, иначе False
.
# Функция проверки четности чисел
def is_even(x):
if x % 2 == 0:
return True
else:
return False
# Функция вывода с циклом for
def print_filter_items(my_filter):
for item in my_filter:
print(item)
# Список из чисел
num_list = [1, 2, 3, 4, 5]
num_filter_list = filter(is_even, num_list)
print_filter_items(num_filter_list)
# Кортеж из чисел
num_tuple = (1, 2, 3, 4, 5)
num_filter_tuple = filter(is_even, num_tuple)
print_filter_items(num_filter_tuple)
Результат:
>>> 2
>>> 4
>>> 2
>>> 4
Воспользуемся lambda функцией:
# Список
my_list = [1, 2, 3, 4, 5, 4.5, 3.7, 8.9, 'Строка', '1.2']
# Фильтрация
my_filter = filter(lambda x: type(x) is int, my_list)
# Отфильтрованный список
my_list_filtered = list(my_filter)
print(my_list_filtered)
Результат (получаем список из целых чисел):
>>> [1, 2, 3, 4, 5]
Усложним фильтрацию:
# Список
my_list = [1, 2, 3, 4, 5, 4.5, 3.7, 8.9, 'Строка', '1.2']
# Фильтрация
my_filter = filter(lambda x: type(x) is int and x > 2, my_list)
# Отфильтрованный список
my_list_filtered = list(my_filter)
print(my_list_filtered)
Результат (выводим целые числа больше 2):
>>> [3, 4, 5]
Пример с функцией None:
# Список
my_list = (True, False, 2, 3, 0.0, 0, 0.7, '', 'B', None)
# Фильтрация
my_filter = filter(None, my_list)
# Отфильтрованный список
my_list_filtered = list(my_filter)
print(my_list_filtered)
Результат:
[True, 2, 3, 0.7, 'B']
Обратите внимание, что нулевая, пустая строка, False
и None
отфильтровываются, потому что их логическое значение – False
.