Szukaj…


Składnia

  • filtr (funkcja, iterowalny)
  • itertools.ifilter (funkcja, iterowalne)
  • future_builtins.filter (funkcja, iterowalna)
  • itertools.ifilterfalse (funkcja, iterowalne)
  • itertools.filterfalse (funkcja, iterowalne)

Parametry

Parametr Detale
funkcjonować wywoływalny, który określa warunek lub None a następnie użyj funkcji tożsamości do filtrowania ( tylko pozycyjne )
iterowalne iterowalne, które będą filtrowane ( tylko pozycyjne )

Uwagi

W większości przypadków zrozumienie lub wyrażenie generatora jest bardziej czytelne, wydajniejsze i wydajniejsze niż filter() lub ifilter() .

Podstawowe zastosowanie filtra

Aby filter odrzuca elementy sekwencji na podstawie niektórych kryteriów:

names = ['Fred', 'Wilma', 'Barney']

def long_name(name):
    return len(name) > 5
Python 2.x 2.0
filter(long_name, names)
# Out: ['Barney']

[name for name in names if len(name) > 5] # equivalent list comprehension
# Out: ['Barney']


from itertools import ifilter
ifilter(long_name, names)       # as generator (similar to python 3.x filter builtin)
# Out: <itertools.ifilter at 0x4197e10>
list(ifilter(long_name, names)) # equivalent to filter with lists
# Out: ['Barney']

(name for name in names if len(name) > 5) # equivalent generator expression
# Out: <generator object <genexpr> at 0x0000000003FD5D38>
Python 2.x 2.6
# Besides the options for older python 2.x versions there is a future_builtin function:
from future_builtins import filter
filter(long_name, names)       # identical to itertools.ifilter
# Out: <itertools.ifilter at 0x3eb0ba8>
Python 3.x 3.0
filter(long_name, names)        # returns a generator
# Out: <filter at 0x1fc6e443470>
list(filter(long_name, names))  # cast to list
# Out: ['Barney']

(name for name in names if len(name) > 5) # equivalent generator expression
# Out: <generator object <genexpr> at 0x000001C6F49BF4C0>

Filtruj bez funkcji

Jeśli parametr funkcji to None , zostanie użyta funkcja tożsamości:

list(filter(None, [1, 0, 2, [], '', 'a']))  # discards 0, [] and ''   
# Out: [1, 2, 'a']
Python 2.x 2.0.1
[i for i in [1, 0, 2, [], '', 'a'] if i] # equivalent list comprehension
Python 3.x 3.0.0
(i for i in [1, 0, 2, [], '', 'a'] if i) # equivalent generator expression

Filtruj jako kontrola zwarcia

filter (pyton 3.x) i ifilter (pyton 2.x) zwracają generator, więc mogą być bardzo przydatne przy tworzeniu test zwarcia jak or lub and :

Python 2.x 2.0.1
 # not recommended in real use but keeps the example short:
from itertools import ifilter as filter
Python 2.x 2.6.1
 from future_builtins import filter

Aby znaleźć pierwszy element, który jest mniejszy niż 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 funkcja daje następny (w tym przypadku pierwszy) element i dlatego jest przyczyną zwarcia.

Funkcja uzupełniająca: filterfalse, ifilterfalse

Jest uzupełnieniem funkcja filter w itertools -module:

Python 2.x 2.0.1
 # not recommended in real use but keeps the example valid for python 2.x and python 3.x
from itertools import ifilterfalse as filterfalse
Python 3.x 3.0.0
from itertools import filterfalse

który działa dokładnie tak samo jak filter generatora, ale zachowuje tylko te elementy, które są 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)


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow