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

Введение

Примеры

Основное использование фильтра

Для того, чтобы 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)

Синтаксис

Параметры

Примечания