Per generare una nuova lista in Python estraendo o cancellando solo quegli elementi di una lista esistente (array) che soddisfano certe condizioni, o eseguendo sostituzioni o conversioni, si usano le list comprehensions.
Ciò che segue è spiegato qui, insieme al codice di esempio.
- Forma di base della notazione di comprensione della lista
- Applicare il processo a tutti gli elementi della lista
- Estrarre ed eliminare dalla lista gli elementi che soddisfano i criteri
- Sostituire o convertire gli elementi che soddisfano le condizioni della lista
Vedi il seguente articolo per esempi specifici di liste di stringhe.
È anche possibile estrarre casualmente gli elementi che non soddisfano i criteri.
Notate che le liste possono memorizzare diversi tipi di dati e sono strettamente diverse dagli array. Se volete gestire gli array in processi che richiedono dimensioni e indirizzi di memoria o l'elaborazione numerica di grandi dati, usate array (libreria standard) o NumPy.
Il seguente elenco è un esempio
l = list(range(-5, 6))
print(l)
# [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5]
Forma di base della notazione di comprensione della lista
Quando si genera una nuova lista da una lista, le list comprehensions sono più semplici da scrivere rispetto ai cicli for.
[expression for any variable name in iterable object if conditional expression]
Un'espressione viene applicata ad un elemento che soddisfa l'espressione condizionale di un oggetto iterabile (come una lista o una tupla) e diventa un elemento di una nuova lista. L'”espressione condizionale if” può essere omessa, nel qual caso l'espressione viene applicata a tutti gli elementi.
Vedi il seguente articolo per maggiori dettagli, inclusa la notazione di comprensione delle liste annidate.
Applicare il processo a tutti gli elementi della lista
Per esempio, se volete applicare qualche elaborazione a tutti gli elementi di una lista, descrivete l'elaborazione desiderata nell'espressione di comprensione della lista di cui sopra.
l_square = [i**2 for i in l]
print(l_square)
# [25, 16, 9, 4, 1, 0, 1, 4, 9, 16, 25]
l_str = [str(i) for i in l]
print(l_str)
# ['-5', '-4', '-3', '-2', '-1', '0', '1', '2', '3', '4', '5']
Questo può essere usato per convertire tra liste di numeri e liste di stringhe.
Estrarre ed eliminare dalla lista gli elementi che soddisfano i criteri
Se l'elemento deve essere selezionato solo da un'espressione condizionale, non viene processato da un'espressione, quindi assume la seguente forma
[variable name for variable name in original list if conditional expression]
Viene generata una nuova lista dalla quale vengono estratti solo gli elementi che soddisfano la condizione (elementi per i quali l'espressione condizionale è vera).
l_even = [i for i in l if i % 2 == 0]
print(l_even)
# [-4, -2, 0, 2, 4]
l_minus = [i for i in l if i < 0]
print(l_minus)
# [-5, -4, -3, -2, -1]
Se “if conditional expression” è impostato su “if not conditional expression”, diventa una negazione, e solo gli elementi che non soddisfano la condizione (elementi per i quali l'espressione condizionale è falsa) possono essere selezionati ed estratti. In altre parole, viene generata una nuova lista da cui vengono rimossi gli elementi che soddisfano la condizione.
l_odd = [i for i in l if not i % 2 == 0]
print(l_odd)
# [-5, -3, -1, 1, 3, 5]
l_plus = [i for i in l if not i < 0]
print(l_plus)
# [0, 1, 2, 3, 4, 5]
Naturalmente, lo stesso risultato si ottiene specificando l'equivalente espressione condizionale senza usare not.
l_odd = [i for i in l if i % 2 != 0]
print(l_odd)
# [-5, -3, -1, 1, 3, 5]
l_plus = [i for i in l if i >= 0]
print(l_plus)
# [0, 1, 2, 3, 4, 5]
La parte dell'espressione condizionale può essere costituita da più condizioni. Si possono usare anche i nots negativi.
l_minus_or_even = [i for i in l if (i < 0) or (i % 2 == 0)]
print(l_minus_or_even)
# [-5, -4, -3, -2, -1, 0, 2, 4]
l_minus_and_odd = [i for i in l if (i < 0) and not (i % 2 == 0)]
print(l_minus_and_odd)
# [-5, -3, -1]
Sostituire o convertire gli elementi che soddisfano le condizioni della lista
Nell'esempio di estrazione di elementi sopra, gli elementi che non soddisfano le condizioni sono stati rimossi.
Se volete eseguire sostituzioni, conversioni, ecc. solo sugli elementi che soddisfano le condizioni, applicate l'operatore ternario alla parte di espressione della notazione di comprensione della lista.
In Python, l'operatore ternario può essere scritto come segue
True Value if Conditional Expression else False Value
a = 80
x = 100 if a > 50 else 0
print(x)
# 100
b = 30
y = 100 if b > 50 else 0
print(y)
# 0
È un po' complicato, ma la combinazione della notazione di comprensione della lista e degli operatori ternari è la seguente.
[True Value if Conditional Expression else False Value for any variable name in original list]
La parte racchiusa tra parentesi è l'operatore ternario (le parentesi non sono necessarie nel codice effettivo).
[(True Value if Conditional Expression else False Value) for any variable name in original list]
Se qualsiasi nome di variabile è scritto come è per valori veri o falsi, il valore dell'elemento originale è usato come è. Se viene scritta un'espressione, viene applicata l'elaborazione di tale espressione.
l_replace = [100 if i > 0 else i for i in l]
print(l_replace)
# [-5, -4, -3, -2, -1, 0, 100, 100, 100, 100, 100]
l_replace2 = [100 if i > 0 else 0 for i in l]
print(l_replace2)
# [0, 0, 0, 0, 0, 0, 100, 100, 100, 100, 100]
l_convert = [i * 10 if i % 2 == 0 else i for i in l]
print(l_convert)
# [-5, -40, -3, -20, -1, 0, 1, 20, 3, 40, 5]
l_convert2 = [i * 10 if i % 2 == 0 else i / 10 for i in l]
print(l_convert2)
# [-0.5, -40, -0.3, -20, -0.1, 0, 0.1, 20, 0.3, 40, 0.5]