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

Введение

Примеры

  • 3

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

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

    Фильтр без функции

    Если параметр функции не 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) # эквивалентное выражение генератора
  • 0

    Фильтр как проверка на короткое замыкание

    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 -функция дает следующему (в данном случае первый) элемент и, следовательно , причина , почему это короткое замыкание.

  • 0

    Дополнительная функция: 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)

Синтаксис

Параметры

Примечания