Python Language
Filtro
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
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>
# 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>
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']
[i for i in [1, 0, 2, [], '', 'a'] if i] # equivalent list comprehension
(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
:
# not recommended in real use but keeps the example short:
from itertools import ifilter as filter
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
:
# not recommended in real use but keeps the example valid for python 2.x and python 3.x
from itertools import ifilterfalse as filterfalse
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)