2013-07-29 41 views
6

Ich habe list1 und list2. list2 ist eine Gruppe von Wörtern, die aus list1, beispielsweise entfernt werden müssen:entfernen Sie Elemente in einer Liste in einer anderen Liste

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

list2=["i","me"] 

gewünschte Ausgabe:

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

ich verschiedene Versionen versucht haben, mit ‚für‘ aber keine bisherigen Ergebnisse.

Irgendwelche Ideen würden geschätzt werden!

+1

Nizza, klar, enthielt und kurze Frage, halten die guten Fragen auf. – hetepeperfan

Antwort

14

Verwendung 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'] 

HINWEIS: Lookups in Listen O(n) sind, sollten Sie einen machen set von list2 statt - Lookups in Sets sind O(1).

+2

Verwenden Sie immer ein Listenverständnis. Obwohl ich für jemanden, der neu bei Python ist, das Gefühl habe, dass Listenkompromittierungen erklärt werden sollten. –

+1

Beachten Sie, dass für nur 2 Elemente, 'list2' ein' tuple' zu ​​machen, ein 'set' in den meisten Fällen übertrifft ... –

+0

@JonClements wie immer, super Kommentar, danke! – alecxe

5

Wie ist es mit der Verwendung von Mengenarithmetik?

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

Oder noch besser (sehr effizient):

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

Es ist viel billiger, nur zu überprüfen, ob ein Element von list1 (ohne es zu setzen) nicht in einer Gruppe von list2 ist ... –

+0

Würde das Entfernen von Duplikaten in list1 für den gesetzten Overhead bezahlen? In den Beispieldaten gibt es wiederholte Einträge - wo wird der Break-even angezeigt? – theodox

Verwandte Themen