
In Python, puoi usare filter() per filtrare (estrarre/rimuovere) gli elementi di un elenco, tupla o altri iterabili che soddisfano le condizioni.
In questo articolo vengono descritti i seguenti contenuti.
- Utilizzo di base del filtro()
- filter() restituisce un iteratore in Python3
- Converti in un elenco
- Estrarre e rimuovere elementi in base alle condizioni
- applicare le espressioni lambda (lambda) e le funzioni definite con def
- Applicazione più condizioni
- Specificare Nessuno come primo argomento
- Estrai elementi falsi:
itertools.filterfalse()
- Utilizzare invece le comprensioni degli elenchi e le espressioni del generatore
Si noti che filter() può essere sostituito da comprensioni di liste o molti generatori, come molti più espressioni avanti, e in casi è preferibile usarle.
Per ulteriori informazioni sull’estrazione di elementi di un elenco utilizzando la comprensione degli elenchi, vedere l’articolo seguente.
Utilizzo di base del filtro()
Il primo argomento di filter() è un oggetto richiamabile come una funzione da applicare e il secondo argomento è un oggetto iterabile come un elenco. Inserire la funzione agli elementi iterabili ed estrarre gli elementi il cui risultato è determinato come True.
filter() restituisce un iteratore in Python3
Ad esempio, utilizzare l’espressione lambda che restituisce True se il valore è un valore pari (= il resto del diviso per 2 è 0).
In Python 3, filter() aggiunge un oggetto di tipo filter che è un iteratore e print() non generi elementi.
l = [-2, -1, 0, 1, 2]
print(filter(lambda x: x % 2 == 0, l))
#
print(type(filter(lambda x: x % 2 == 0, l)))
# <class 'filter'>
Il valore dell’iteratore può essere recuperato con un’istruzione per.
for i in filter(lambda x: x % 2 == 0, l):
print(i)
# -2
# 0
# 2
Nota che filter() in Python 2 fornisce un elenco, quindi fai attenzione quando esegui il codice Python 2 in Python 3.
Converti in un elenco
Se vuoi ottenere il risultato di filter() in una lista, usa list().
print(list(filter(lambda x: x % 2 == 0, l)))
# [-2, 0, 2]
Estrarre e rimuovere elementi in base alle condizioni
filter() estrae gli elementi il cui risultato è determinato come True applicando la funzione del primo argomento. Se vuoi rimuovere un elemento, specifica una funzione il cui risultato è l’opposto.
Ad esempio, “rimuovi elementi pari” equivale a “estrai elementi dispari”.
print(list(filter(lambda x: x % 2 == 0, l)))
# [-2, 0, 2]
print(list(filter(lambda x: x % 2 != 0, l)))
# [-1, 1]
Come nell’esempio sopra, puoi sostituire gli operatori di confronto con quelli che producono risultati opposti (== e ! =, > e <=, ecc.), oppure puoi usare non per la negazione.
Ad esempio, estrai e rimuovi le stringhe che terminano con ‘e’.
l_s = ['apple', 'orange', 'strawberry']
print(list(filter(lambda x: x.endswith('e'), l_s)))
# ['apple', 'orange']
print(list(filter(lambda x: not x.endswith('e'), l_s)))
# ['strawberry']
Contrariamente a filter(), viene anche fornita una funzione itertools.filterfalse() per mantenere gli elementi False. È più avanti.
applicare le espressioni lambda (lambda) e le funzioni definite con def
Il primo argomento di filter() è un oggetto richiamabile.
Come negli esempi precedenti, vengono spesso utilizzate espressioni lambda (lambda), ma ovviamente è anche possibile specificare una funzione definita con def.
def is_even(x):
return x % 2 == 0
l = [-2, -1, 0, 1, 2]
print(list(filter(is_even, l)))
# [-2, 0, 2]
Applicazione più condizioni
Se desideri applicare più condizioni, puoi specificare un’espressione o una funzione lambda che collega più condizioni con eo o.
l = [-2, -1, 0, 1, 2]
print(list(filter(lambda x: x % 2 == 0 and x > 0, l)))
# [2]
print(list(filter(lambda x: x % 2 == 0 or x > 0, l)))
# [-2, 0, 1, 2]
Specificare Nessuno come primo argomento
Se viene specificato Nessuno come primo argomento di filter(), vengono estratti gli elementi determinati come True (= elementi veritieri).
l_b = [True, False]
print(list(filter(None, l_b)))
# [True]
Vengono determinati non solo Vero e Falso, ma anche numeri, elenchi e stringhe.
Ad esempio, nel caso dei numeri, 0 è considerato Falso e gli altri sono considerati Vero, nel caso di elenchi e stringhe, se è vuoto, è considerato Falso e gli altri sono considerati Veri.
Vedere il seguente articolo per i dettagli.
Pertanto, se si specifica None come primo argomento di filter(), 0 e l’elenco e la stringa vuota vengono rimossi.
l = [-2, -1, 0, 1, 2]
print(list(filter(None, l)))
# [-2, -1, 1, 2]
l_2d = [[0, 1, 2], [], [3, 4, 5]]
print(list(filter(None, l_2d)))
# [[0, 1, 2], [3, 4, 5]]
l_s = ['apple', '', 'orange', 'strawberry']
print(list(filter(None, l_s)))
# ['apple', 'orange', 'strawberry']
Contrariamente a filter(), viene anche fornita una funzione itertools.filterfalse() per mantenere gli elementi False.
L’utilizzo è lo stesso di filter(). Devi importare itertools.
import itertools
l = [-2, -1, 0, 1, 2]
print(list(itertools.filterfalse(lambda x: x % 2 == 0, l)))
# [-1, 1]
print(list(itertools.filterfalse(lambda x: x % 2 != 0, l)))
# [-2, 0, 2]
l_s = ['apple', 'orange', 'strawberry']
print(list(itertools.filterfalse(lambda x: x.endswith('e'), l_s)))
# ['strawberry']
Come modificato in precedenza, lo stesso risultato può essere ottenuto con filter(), ma in alcuni casi, itertools.filterfalse() può essere utilizzato per scrivere codice la cui intenzione è più chiara rispetto all’utilizzo di filter () e non .
Se il primo argomento di itertools.filterfalse() è impostato su None, vengono estratti gli elementi determinati come Falsi (= elementi falsi).
l = [-2, -1, 0, 1, 2]
print(list(itertools.filterfalse(None, l)))
# [0]
Utilizzare invece le comprensioni degli elenchi e le espressioni del generatore
L’equivalente di filter() può essere ottenuto anche con la comprensione degli elenchi e le espressioni del generatore.
Si noti che filter(function, iterable) è equivalente all’espressione del generatore (item for item in iterable if function(item)) se la funzione non è None e (item for item in iterable if item) se la funzione è None.
Funzioni integra – filter() — Documentazione Python 3.9.7
l = [-2, -1, 0, 1, 2]
print([x for x in l if x % 2 == 0])
# [-2, 0, 2]
print([x for x in l if x % 2 != 0])
# [-1, 1]
l_s = ['apple', 'orange', 'strawberry']
print([x for x in l_s if x.endswith('e')])
# ['apple', 'orange']
print([x for x in l_s if not x.endswith('e')])
# ['strawberry']
l = [-2, -1, 0, 1, 2]
print([x for x in l if x])
# [-2, -1, 1, 2]
l_2d = [[0, 1, 2], [], [3, 4, 5]]
print([x for x in l_2d if x])
# [[0, 1, 2], [3, 4, 5]]
Se vuoi ottenere una lista come list(filter()), usa le list comprehensions, e se vuoi ottenere un iteratore come filter(), usa un’espressione generatore.
Come mostrato nella seguente domanda sull’overflow dello stack, nella maggior parte dei casi, è preferibile utilizzare la comprensione degli elenchi e le espressioni del generatore a filter() perché il codice è più conciso e chiaro.
Tieni che, poiché la velocità di più può presentare variazione a causa di vari fattori, se la velocità è importante per te, ti riguarda di misurarla in condizioni il vicino possibile tue ipotesi.