2013-07-29 15 views
6

I have list1 e list2. list2 è un gruppo di parole che devono essere rimossi dal list1, ad esempio:rimuovere elementi in una lista presente in un'altra lista

list1=['paste', 'text', 'text', 'here', 'here', 'here', 'my', 'i', 'i', 'me', 'me'] 

list2=["i","me"] 

uscita desiderata:

list3=['paste', 'text', 'text', 'here', 'here', 'here', 'my'] 

Ho provato versioni differenti utilizzando 'per' ma i risultati finora.

Qualsiasi idea sarebbe apprezzata!

+1

Nizza, chiara, contenuta e breve domanda, mantenere il buon domande. – hetepeperfan

risposta

14

Uso list comprehension:

>>> list1 = ['paste', 'text', 'text', 'here', 'here', 'here', 'my', 'i', 'i', 'me', 'me'] 
>>> list2 = ["i","me"] 
>>> list3 = [item for item in list1 if item not in list2] 
>>> list3 
['paste', 'text', 'text', 'here', 'here', 'here', 'my'] 

NOTA: Le ricerche in elenchi sono O(n), considerare la possibilità di un set da list2 invece - le ricerche in set sono O(1).

+2

Usa sempre una comprensione di lista. Anche se per qualcuno di nuovo in Python mi sento come se dovessi spiegare la comprensione delle liste. –

+1

Nota che per 2 soli elementi, facendo 'list2' una' tupla' eseguirà un 'set' nella maggior parte dei casi ... –

+0

@JonClements come sempre, ottimo commento, grazie! – alecxe

5

Che dire di sfruttare l'aritmetica del set?

diff = set(list1) - set(list2) 
result = [o for o in list1 if o in diff] 

O ancora meglio (più efficiente):

set2 = set(list2) 
result = [o for o in list1 if o not in set2] 
+1

È molto meno costoso controllare semplicemente che un elemento di list1 (senza renderlo un set) non sia in un set di list2 ... –

+0

La rimozione di duplicati in list1 dovrebbe pagare l'overhead impostato? Nei dati di esempio ci sono articoli ripetuti - dove è probabile che si verifichi il pareggio? – theodox

Problemi correlati