Фильтрация элементов последовательности в 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, часто являются самыми простыми и понятными,
способами фильтрации простых данных. Они также обладают дополнительной силой для преобразования
данных.