Vai al contenuto principale

Python filter(): tieni solo ciò che ti serve

Impara a usare la funzione filter() di Python per estrarre elementi da liste o altri iterabili. Comprendi le differenze chiave tra filter e strumenti simili in Python.
· 7 min leggi

Scopri con l'IA

Il filtraggio è uno dei compiti più comuni in Python, ed è per questo che Python lo rende semplice. Uno dei modi più facili per filtrare i dati è con la funzione integrata filter(). Come suggerisce il nome, filter() ti permette di estrarre solo gli elementi che soddisfano una certa condizione (o più condizioni).

Questa guida ti mostra come funziona, quando usarla e come si confronta con altri strumenti di filtraggio. Buona lettura!

Cosa fa Python filter()

filter() ti consente di estrarre elementi da una lista, una tupla o qualsiasi iterabile, ma solo se superano il tuo test. Fornisci una funzione (a volte viene chiamata predicato) che prende ogni elemento e restituisce True o False. Se il test passa (cioè se la tua funzione restituisce True) filter() lo mantiene. Altrimenti salta l'elemento. È piuttosto autoesplicativo, quindi andiamo avanti.

Sintassi di Python filter()

Ecco il formato:

filter(function, iterable)
  • function: Specifica il test che vuoi applicare a ogni elemento. Deve prendere un argomento e restituire True o False.

  • iterable: Fornisce una lista, una tupla, una stringa o qualsiasi oggetto su cui puoi iterare.

Quando chiami filter(), restituisce un oggetto filtro speciale, non direttamente una lista o una tupla. Per lavorare effettivamente con i risultati filtrati, di solito racchiudi l'output in una lista o una tupla. Questa scelta progettuale mantiene filter() efficiente, ma è qualcosa da tenere a mente mentre scrivi il codice.

Esempi di Python filter()

Facciamo un po' di pratica.

Python filter() con una funzione personalizzata

Usiamo filter() con una funzione che scriviamo noi.

Supponiamo di voler mantenere solo i numeri pari da una lista:

def is_even(num):
    return num % 2 == 0

numbers = [1, 2, 3, 4, 5, 6]
result = filter(is_even, numbers)
print(list(result))

Questo stamperà:

[2, 4, 6]

Nota come is_even controlla se un numero è divisibile per 2. filter() usa la nostra funzione personalizzata per testare ogni elemento e mantenere quelli che superano il test.

Python filter() con funzioni lambda

Ovviamente, non tutti i filtri richiedono la definizione completa di una funzione. A volte la regola di filtraggio è così semplice o così specifica a un punto del codice che definire una funzione con nome è eccessivo.

Ecco lo stesso esempio dei numeri pari, ma usando una lambda per un test conciso e in linea:

numbers = [1, 2, 3, 4, 5, 6] 
result = filter(lambda x: x % 2 == 0, numbers) 
print(list(result))

Otterrai lo stesso output di prima.

Usare una lambda con filter() è particolarmente comune quando vuoi mantenere il codice breve e mirato. È perfetto per filtraggi una tantum, perché ti permette di esprimere la regola proprio dove ti serve.

Python filter() con None come funzione

A volte vuoi usare filter() per rimuovere valori vuoti o falsi. Cose come 0, stringhe vuote, None o False, e vogliamo farlo senza scrivere una funzione personalizzata.

Python ha un trucco per questo: se imposti l'argomento funzione di filter() a None, filter() rimuoverà automaticamente tutti gli elementi che Python considera False.

Ecco un esempio:

items = [0, 1, '', 'hello', [], [2, 3], None, False, True] 
result = filter(None, items) 
print(list(result))

Questo stamperà:

[1, 'hello', [2, 3], True]

Filtrare dati testuali

Ora applichiamo filter() a un problema pratico e quotidiano. Supponi di avere una lista di parole e di volere solo quelle che iniziano con "a". Questo tipo di filtraggio mirato capita spesso quando si elabora del testo.

words = ['apple', 'banana', 'apricot', 'cherry', 'avocado'] 
result = filter(lambda word: word.startswith('a'), words) 
print(list(result))

Otterrai:

['apple', 'apricot', 'avocado']

Filtrare con più condizioni

A volte i tuoi criteri di filtraggio diventano più complessi. E se ti servono elementi che soddisfano diverse condizioni? Ecco come puoi farlo usando una lambda. In questo esempio, troviamo i numeri che sono sia pari che maggiori di 10.

numbers = [4, 10, 12, 15, 20, 23, 28] 
result = filter(lambda x: x % 2 == 0 and x > 10, numbers) 
print(list(result))

Questo stampa:

[12, 20, 28]

(Se avessi ancora più condizioni, prenderei in considerazione il passaggio da una lambda a una funzione con nome per maggiore chiarezza.)

filter() vs. comprensione di lista

Le comprensioni di lista sono un altro modo popolare per selezionare gli elementi. Entrambi gli approcci ti permettono di filtrare i dati, ma ognuno ha il suo stile.

Ecco di nuovo l'esempio dei numeri pari, questa volta usando una comprensione di lista:

numbers = [1, 2, 3, 4, 5, 6] 
result = [x for x in numbers if x % 2 == 0] 
print(result)
[2, 4, 6]

Sia filter() che le comprensioni di lista portano a termine il lavoro. Le comprensioni di lista sono spesso più leggibili per filtri semplici, soprattutto quando la regola è breve e lineare.

D'altra parte, filter() funziona bene quando stai già lavorando con funzioni o quando vuoi concatenare più passaggi di elaborazione.

Usi più avanzati

Proviamo a trovare casi un po' più interessanti:

filter() con altri iterabili

Proprio come abbiamo fatto con le liste, filter() funziona anche con qualsiasi iterabile, come tuple, set — persino le espressioni generatore. È utile saperlo perché i tuoi dati non saranno sempre sotto forma di lista.

Ecco come puoi filtrare una tupla:

numbers = (10, 15, 20, 25, 30) 
result = filter(lambda x: x > 20, numbers) 
print(tuple(result))

Questo stamperà:

(25, 30)

Ricorda solo di convertire l'oggetto filtro nel tipo che ti serve (lista, tupla, ecc.) quando devi usare direttamente i risultati.

Ho anche menzionato i generatori quindi, per completezza, mostro anche un esempio di filtraggio con generatori:

numbers = (x for x in range(10))
result = filter(lambda x: x % 2 == 0, numbers)
print(list(result))

Questo è un generatore perché questa riga: numbers = (x for x in range(10)) crea un oggetto generatore. (È pigro e non genera tutti i valori in una volta sola.)

L'ultima riga: print(list(result)) forza la valutazione convertendo l'oggetto filtro lazy in una lista.

Combinare filter() con map()

E se volessi sia filtrare che trasformare i tuoi dati, ad esempio, nel prossimo esempio, elevare al quadrato solo i numeri pari di una lista?

Python lo rende semplice permettendoti di combinare filter() e map(). Per prima cosa, filter() seleziona gli elementi che ti interessano, poi map() applica un'altra funzione a ciascuno di essi.

Ecco la pratica:

numbers = [1, 2, 3, 4, 5, 6] 
evens = filter(lambda x: x % 2 == 0, numbers) 
squared = map(lambda x: x ** 2, evens) 
print(list(squared))

Questo stampa:

[4, 16, 36]

Concatenando filter() e map(), puoi costruire pipeline di dati chiare e leggibili, prima selezionando gli elementi che ti interessano e poi trasformandoli secondo necessità. Troverai molte occasioni per usare questo schema nel tuo lavoro.

Cose a cui prestare attenzione

Per quanto utile sia filter(), ci sono alcuni errori comuni:

  • filter() restituisce un oggetto filtro, non una lista. Questo può trarre in inganno se ti aspetti di vedere subito i risultati. Racchiudilo sempre in una lista (o tupla) se ti serve visualizzare o riutilizzare i risultati.

  • filter() funziona solo con un iterabile alla volta. Se vuoi filtrare basandoti su più liste, dovrai usare zip o un altro approccio.

  • filter() è lazy. Non elabora davvero i dati finché non li converti in una lista, in una tupla o non ci iteri sopra. Tieni a mente questo comportamento durante il debug.

Conclusione

Come hai visto, la funzione filter() di Python ti offre un modo rapido per ripulire i dati estraendo solo ciò che conta. filter() è utile sia se stai scrivendo una lambda una tantum sia se stai usando una funzione con nome. 

Se non ti è chiaro come usare filter(), o se ti sembra abbastanza semplice e vuoi continuare a imparare, abbiamo ottime risorse per aiutarti. Ti consiglio il nostro Python Programming Fundamentals skill track. 

Josef Waples

Autore

Josef Waples

Sono uno scrittore e editor di data science, con contributi a articoli di ricerca su riviste scientifiche. Sono particolarmente interessato ad algebra lineare, statistica, R e affini. Inoltre, gioco anche parecchio a scacchi! 

Domande frequenti su Python filter()

Cosa fa la funzione Python filter()?

La funzione filter() prende una funzione e un iterabile e restituisce un nuovo iterabile con solo gli elementi che superano un test. La funzione di test dovrebbe restituire True per gli elementi da mantenere e False per quelli da scartare.

Perché devo racchiudere il risultato di filter() in list() o tuple()?

filter() restituisce un oggetto filtro, che è un iteratore. Per visualizzare o riutilizzare i risultati filtrati, in genere lo convertirai in una lista o in una tupla usando list() o tuple(). Questo passaggio è essenziale per stampare, fare debug o passare il risultato ad altre funzioni.

Posso usare filter() senza scrivere una funzione personalizzata?

Sì. Puoi usare una funzione lambda per test brevi e una tantum, oppure passare None come argomento funzione per rimuovere automaticamente tutti i valori "falsy" come 0, '', None e False.

Come si confronta filter() con le comprensioni di lista?

Sia filter() che le comprensioni di lista permettono di filtrare i dati, ma le comprensioni di lista sono spesso più leggibili per condizioni semplici. filter() è utile quando riusi la logica tramite funzioni o quando lo concateni con strumenti come map().

Posso applicare più condizioni con filter()?

Assolutamente. Puoi combinare più condizioni usando operatori logici all'interno della tua funzione di test o lambda. Per logiche complesse, spesso è meglio usare una funzione con nome per mantenere il codice leggibile.

Argomenti

Correlato