Skip to content

Filtrare (estrarre/rimuovere) gli elementi di una lista con filter() in Python

Python

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.