
In Python, puoi generare un nuovo elenco da un elenco di stringhe estraendo, sostituendo o trasformando elementi che soddisfano determinate condizioni con la comprensione degli elenchi.
Questo articolo spiega brevemente le comprensioni dell’elenco e quindi descrive quanto segue con il codice di esempio.
- Estrarre le stringhe che contengono o non contengono una specifica
- Sostituisci una stringa specifica in un elenco
- Estrarre le stringhe che iniziano o non iniziare con una stringa specifica
- Estrarre le stringhe che terminano o non terminano con una stringa specifica
- Estrai le stringhe con lettere maiuscole o minuscole
- Converti maiuscolo e minuscolo
- Estrai le stringhe in ordine alfabetico o numerico
- Condizioni multiple
- Espressione regolare (regex)
l’articolo seguente per ulteriori informazioni su come estrarre e sostituire le stringhe.
Elena le comprensioni
Per generare un nuovo elenco da un elenco, puoi utilizzare la comprensione degli elenchi, che è più semplice da scrivere rispetto al ciclo for.
[expression for variable_name in iterable if condition]
Se vuoi solo estrarre elementi che soddisfano la condizione, non è necessario elaborarli con expression; usa solo nome_variabile.
[variable_name for variable_name in iterable if condition]
Se modifichi if condition in if not condition, puoi estrarre gli elementi che non soddisfano la condizione.
Per ulteriori informazioni sull’estrazione, la sostituzione e la conversione degli elementi dell’elenco utilizzando la seguente comprensione dell’elenco, fare riferimento al seguente articolo.
stringa_specifica in stringa_destinazione contiene True se la stringa_destinazione contiene una stringa_specifica. Utilizzare non per negazione.
l = ['oneXXXaaa', 'twoXXXbbb', 'three999aaa', '000111222']
l_in = [s for s in l if 'XXX' in s]
print(l_in)
# ['oneXXXaaa', 'twoXXXbbb']
l_in_not = [s for s in l if 'XXX' not in s]
print(l_in_not)
# ['three999aaa', '000111222']
Sostituisci una stringa specifica in un elenco
Se vuoi la stringa di elementi di una lista, usa il metodo string() per ogni elemento con la comprensione della lista().
Se non è presente alcuna stringa da sostituire, l’applicazione di replace() non la selezionare, quindi non è necessario un elemento con la condizione if.
l_replace = [s.replace('XXX', 'ZZZ') for s in l]
print(l_replace)
# ['oneZZZaaa', 'twoZZZbbb', 'three999aaa', '000111222']
Per un intero elemento contenente una stringa specifica, estrarlo con in e utilizzare condizionali (operatore ternario), X if condition else Y.
Utilizzare le espressioni condizionali per la parte delle espressioni delle espressioni degli elenchi.
l_replace_all = ['ZZZ' if 'XXX' in s else s for s in l]
print(l_replace_all)
# ['ZZZ', 'ZZZ', 'three999aaa', '000111222']
Potrebbe essere più facile capire ed evitare errori con le parentesi. Grammaticamente, non importa se ci sono parentesi o meno.
[('ZZZ' if ('XXX' in s) else s) for s in l]
Il metodo string bootswith() restituisce True se la stringa inizia con la stringa specifica.
l_start = [s for s in l if s.startswith('t')]
print(l_start)
# ['twoXXXbbb', 'three999aaa']
l_start_not = [s for s in l if not s.startswith('t')]
print(l_start_not)
# ['oneXXXaaa', '000111222']
Il metodo stringendwith() restituisce True se la stringa termina con la stringa specifica.
l_end = [s for s in l if s.endswith('aaa')]
print(l_end)
# ['oneXXXaaa', 'three999aaa']
l_end_not = [s for s in l if not s.endswith('aaa')]
print(l_end_not)
# ['twoXXXbbb', '000111222']
È possibile utilizzare i metodi di stringa isupper(), islower() per se una stringa è tutta maiuscola o tutta minuscola.
l_lower = [s for s in l if s.islower()]
print(l_lower)
# ['three999aaa']
Converti maiuscolo e minuscolo
Se vuoi scegliere tutte le lettere in maiuscolo o minuscolo, usa i metodi stringa upper() o lower(). Vengono forniti anche altri metodi, come capitalize() per mettere in maiuscolo la prima lettera e swapcase() per scambiare maiuscole e minuscole.
Utilizzare le espressioni condizionali per gli unici elementi che soddisfano le condizioni.
l_upper_all = [s.upper() for s in l]
print(l_upper_all)
# ['ONEXXXAAA', 'TWOXXXBBB', 'THREE999AAA', '000111222']
l_lower_to_upper = [s.upper() if s.islower() else s for s in l]
print(l_lower_to_upper)
# ['oneXXXaaa', 'twoXXXbbb', 'THREE999AAA', '000111222']
È possibile utilizzare i metodi di stringa isalpha() e isumeric() per se una stringa è tutta alfabetica o tutta numerica.
l_isalpha = [s for s in l if s.isalpha()]
print(l_isalpha)
# ['oneXXXaaa', 'twoXXXbbb']
l_isnumeric = [s for s in l if s.isnumeric()]
print(l_isnumeric)
# ['000111222']
Condizioni multiple
È inoltre possibile specificare più condizioni utilizzando eeo nella parte relativa alle condizioni delle comprensioni dell’elenco. Puoi anche usare la negazione no.
Se si utilizza più di tre condizioni, racchiude ciascun gruppo con () è più sicuro poiché i risultati differiranno a seconda dell’ordine.
l_multi = [s for s in l if s.isalpha() and not s.startswith('t')]
print(l_multi)
# ['oneXXXaaa']
l_multi_or = [s for s in l if (s.isalpha() and not s.startswith('t')) or ('bbb' in s)]
print(l_multi_or)
# ['oneXXXaaa', 'twoXXXbbb']
Espressione regolare (regex)
È possibile utilizzare le espressioni regolari (regex) per un’elaborazione più flessibile.
re.match() invia un oggetto di corrispondenza se corrisponde o None se non corrisponde.
Perché gli oggetti di corrispondenza vengono valutati come Vero e Nessuno come Falso, se si desidera estrarre solo gli elementi che corrispondono a un modello regex, è necessario applicare re.match() parte delle condizioni come delle comprensioni dell’elenco negli esempi precedenti.
import re
l = ['oneXXXaaa', 'twoXXXbbb', 'three999aaa', '000111222']
l_re_match = [s for s in l if re.match('.*XXX.*', s)]
print(l_re_match)
# ['oneXXXaaa', 'twoXXXbbb']
Puoi anche usare re.sub() per sostituire la parte che corrisponde a un pattern regex. Se desideri rimuovere e sostituire solo gli elementi associati, aggiungi if condition.
l_re_sub_all = [re.sub('(.*)XXX(.*)', r'2---1', s) for s in l]
print(l_re_sub_all)
# ['aaa---one', 'bbb---two', 'three999aaa', '000111222']
l_re_sub = [re.sub('(.*)XXX(.*)', r'2---1', s) for s in l if re.match('.*XXX.*', s)]
print(l_re_sub)
# ['aaa---one', 'bbb---two']