Фильтрация элементов последовательности в Python

Здравствуйте. В сегодняшней статье мы рассмотрим как отфильтровать данные из последовательности в Python. В качестве последовательности здесь используется список list.

Постановка задачи

Имеется последовательность чисел в списке Python. Необходимо отфильтровать список или уменьшить значения в нем, в соответствии с некоторым критерием.

Решение

Наиболее легким путем фильтрации данных из списка будет использование генератора списков.


mylist = [1, 4, -5, 10, -7, 2, 3, -1]

print([n for n in mylist if n > 0])

print([n for n in mylist if n < 0])

Обратная строна данного подхода в том, что генераторы списков загружают в память компьютера все данные. При больших объемах входных данных это может стать проблемой. В таком случае можно использовать выражение генератор, чтобы загружать данные в память порциями.

pos = (n for n in mylist if n > 0)

print(pos)
# <generator object <genexpr> at 0x000001987F0C5FC0> 

for x in pos:
  print(x)

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

values = ['1', '2', '-3', '-', '4', 'N/A', '5']

def is_int(val):
 try:
   x = int(val)
   return True
 except ValueError:
   return False

ivals = list(filter(is_int, values))

print(ivals)

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

Таким образом, генератор списка и генераторные выражения в Python, часто являются самыми простыми и понятными, способами фильтрации простых данных. Они также обладают дополнительной силой для преобразования данных.

Источник