Введение
Примеры
Основное использование фильтра
Для того, чтобы filter
Сбрасывает элементы последовательности на основе некоторых критериев:
names = ['Fred', 'Wilma', 'Barney']
def long_name(name):
return len(name) > 5
filter (long_name, names) # Out: ['Barney'] [имя для имени в именах, если len (name)> 5] # понимание списка эквивалентных номеров # Out: ['Barney'] из itertools импортировать ifilter ifilter (long_name, names) # как генератор (похож на встроенный фильтр python 3.x) # Out: list (ifilter (long_name, names)) # эквивалент фильтра со списками # Out: ['Barney'] (имя для имени в именах, если len (name)> 5) # эквивалентное выражение генератора # Out: в 0x0000000003FD5D38> # Помимо опций для более старых версий Python 2.x, есть функция future_builtin: из фильтра фильтра import_builtins (long_name, names) #, идентичного itertools.ifilter # Out: фильтр (long_name, names) # возвращает генератор # Out: list (filter (long_name, names)) # приведение к списку # Out: ['Barney'] (имя для имени в именах, если len (name)> 5) # эквивалентное выражение генератора # Out: в 0x000001C6F49BF4C0>
Фильтр без функции
Если параметр функции не None
, то будет использоваться функция тождества:
list(filter(None, [1, 0, 2, [], '', 'a'])) # discards 0, [] and ''
# Out: [1, 2, 'a']
[i для i в [1, 0, 2, [], '', 'a'], если i] # эквивалентное понимание списка (i для i в [1, 0, 2, [], '', 'a'], если i) # эквивалентное выражение генератора
Фильтр как проверка на короткое замыкание
filter
(Python 3.x) и ifilter
(Python 2.x) возвращает генератор , таким образом они могут быть очень удобно при создании теста короткого замыкания , как or
или and
:
# не рекомендуется в реальном использовании, но пример краткий: из itertools импортируйте ifilter в качестве фильтра из фильтра импорта future_builtins
Чтобы найти первый элемент, который меньше 100:
car_shop = [('Toyota', 1000),('rectangular tire', 80),('Porsche', 5000)]
def find_something_smaller_than(name_value_tuple):
print('Check {0}, {1}$'.format(*name_value_tuple)
return name_value_tuple[1] < 100
next(filter(find_something_smaller_than, car_shop))
# Print: Check Toyota, 1000$
# Check rectangular tire, 80$
# Out:('rectangular tire', 80)
next
-функция дает следующему (в данном случае первый) элемент и, следовательно , причина , почему это короткое замыкание.
Дополнительная функция: filterfalse, ifilterfalse
Существует дополнительная функция filter
в itertools
-модуле:
# не рекомендуется в реальном использовании, но сохраняет пример действительным для python 2.x и python 3.x из itertools import ifilterfalse как filterfalse из itertools импортировать filterfalse
который работает точно так же , как генератор filter
, но сохраняет только те элементы , которые являются False
:
# Usage without function (None):
list(filterfalse(None, [1, 0, 2, [], '', 'a'])) # discards 1, 2, 'a'
# Out: [0, [], '']
# Usage with function
names = ['Fred', 'Wilma', 'Barney']
def long_name(name):
return len(name) > 5
list(filterfalse(long_name, names))
# Out: ['Fred', 'Wilma']
# Short-circuit useage with next:
car_shop = [('Toyota', 1000),('rectangular tire', 80),('Porsche', 5000)]
def find_something_smaller_than(name_value_tuple):
print('Check {0}, {1}$'.format(*name_value_tuple)
return name_value_tuple[1] < 100
next(filterfalse(find_something_smaller_than, car_shop))
# Print: Check Toyota, 1000$
# Out:('Toyota', 1000)
# Using an equivalent generator:
car_shop = [('Toyota', 1000),('rectangular tire', 80),('Porsche', 5000)]
generator = (car for car in car_shop if not car[1] < 100)
next(generator)