Filtraggio di un elenco di stringhe in base al contenuto


102

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:


170

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.


30
@ S.Lott: perché? Cosa c'è di sbagliato nell'apprendere utili argomenti di programmazione avanzata in un contesto adatto?
Eli Bendersky

12
@ S.Lott: Penso che i lambda stiano facilitando la considerazione delle funzioni come oggetti di prima classe, il che è importante per alcuni paradigmi di programmazione. Non direi che sono molto importanti per me , ma credo che anche i neofiti possano trarre vantaggio dal pensare alla programmazione in questo modo, e sicuramente non lo chiamerei infliggere .
Eli Bendersky

6
@ S.Lott: ma non è 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?
Eli Bendersky

5
Non sono solo gli n00bs a trovare questa risposta
Bryan

9
Sono un n00b e ora mi è stato presentato lambda. sensazione fantastica di saperlo. ora ne imparerò di più.
a_secenthusiast


16
# To support matches from the beginning, not any matches:

items = ['a', 'ab', 'abc', 'bac']
prefix = 'ab'

filter(lambda x: x.startswith(prefix), items)

evitare l'elenco come nome della variabile poiché questo è un tipo di oggetto python.
Rutger Hofste

6

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)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.