Сообщить об ошибке.

Функция filter() в Python, фильтрует список по условию

Позволяет отфильтровать элементы последовательности по условию

Синтаксис:

filter(func, iterable)

Параметры:

Возвращаемое значение:

  • filter object - отфильтрованная последовательность.

Описание:

Функция 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]

Удаление ложных значений (False, None, 0 и '') из списка с помощью filter().

>>> lst = [0, 1, False, 2, '', 3, 'a', 's', 34]
>>> list(filter(None, lst))
# [1, 2, 3, 'a', 's', 34]