Data la lista ['a','ab','abc','bac'], voglio calcolare una lista con le stringhe che 'ab'contengono. Cioè il risultato è ['ab','abc']. Come può essere fatto in Python?
Risposte:
Questo semplice filtraggio può essere ottenuto in molti modi con Python. L'approccio migliore consiste nell'utilizzare le "comprensioni di elenco" come segue:
>>> lst = ['a', 'ab', 'abc', 'bac']
>>> [k for k in lst if 'ab' in k]
['ab', 'abc']
Un altro modo è usare la filterfunzione. In Python 2:
>>> filter(lambda k: 'ab' in k, lst)
['ab', 'abc']
In Python 3, restituisce un iteratore invece di un elenco, ma puoi lanciarlo:
>>> list(filter(lambda k: 'ab' in k, lst))
['ab', 'abc']
Sebbene sia una pratica migliore usare una comprensione.
lambdail compagno perfetto filterin questo caso? Penso che scrivere una funzione separata solo per verificare se abè nella lista data è un eccessivo. Quindi sta scrivendo una funzione più generale che fondamentalmente avvolge l' inoperatore. Come filteruseresti in modo più chiaro senza lambdaqui?
[x for x in L if 'ab' in x]
# To support matches from the beginning, not any matches:
items = ['a', 'ab', 'abc', 'bac']
prefix = 'ab'
filter(lambda x: x.startswith(prefix), items)
L'ho provato rapidamente nella shell interattiva:
>>> l = ['a', 'ab', 'abc', 'bac']
>>> [x for x in l if 'ab' in x]
['ab', 'abc']
>>>
Perché funziona? Perché lain operatore è definito per le stringhe nel senso: "è una sottostringa di".
Inoltre, potresti prendere in considerazione la possibilità di scrivere il ciclo anziché utilizzare la sintassi di comprensione dell'elenco usata sopra:
l = ['a', 'ab', 'abc', 'bac']
result = []
for s in l:
if 'ab' in s:
result.append(s)
mylist = ['a', 'ab', 'abc']
assert 'ab' in mylist