Ricerca…


Sintassi

  • filtro (funzione, iterabile)
  • itertools.ifilter (function, iterable)
  • future_builtins.filter (funzione, iterabile)
  • itertools.ifilterfalse (funzione, iterabile)
  • itertools.filterfalse (function, iterable)

Parametri

Parametro Dettagli
funzione callable che determina la condizione o None quindi usa la funzione identity per il filtraggio ( solo posizionale )
iterabile iterabile che verrà filtrato ( solo posizionale )

Osservazioni

Nella maggior parte dei casi , l'espressione di comprensione o generatore è più leggibile, più potente e più efficiente di filter() o ifilter() .

Uso di base del filtro

Per filter elementi degli scarti di una sequenza in base ad alcuni criteri:

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>

Filtro senza funzione

Se il parametro function è None , verrà utilizzata la funzione identity:

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

Filtro come controllo di cortocircuito

filter (python 3.x) e ifilter (python 2.x) restituiscono un generatore in modo che possano essere molto utili quando si crea un test di cortocircuito come or o 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

Per trovare il primo elemento che è inferiore a 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)

La funzione next dà il prossimo (in questo caso il primo) elemento ed è quindi il motivo per cui è un cortocircuito.

Funzione complementare: filterfalse, ifilterfalse

C'è una funzione complementare per il filter nel modulo- itertools :

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

che funziona esattamente come il filter generatore ma mantiene solo gli elementi che sono 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
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow