Seite 1 von 1

Test ob Elemente einer Liste in einer anderen Liste

Verfasst: Samstag 1. März 2014, 15:50
von mathematik
Hallo zusammen,

ich habe eine kurze Frage:
Wie kann ich testen, ob Elemente einer Liste in einer anderen Liste enthalten sind?
Wenn ich also eine Liste L1 und eine Liste L2 habe und nur die Elemente von L1 möchte, die nicht in L2 sind. Was ich machen würde ist folgendes:

Code: Alles auswählen

Z=[]
for i in range(len(L1)):
... if L1[i] not in L2:
...      Z.append(L1[i])
Das ist allerdings für große Listen sehr uneffektiv. Gibt es da eine andere Möglichkeit?
Vielen Dank!

Re: Test ob Elemente einer Liste in einer anderen Liste

Verfasst: Samstag 1. März 2014, 16:09
von BlackJack
@mathematik: Deinem Namen nach solltest Dir Mengenoperationen ein begriff sein. :-) Schau Dir mal den `set`-Datentyp an.

Und ``for i in range(len(sequence)):`` nur um `i` dann als Index in `sequence` zu verwenden ist in Python ein „anti pattern”. Du hättest *direkt* über die Elemente von `L1` iterieren können. Mit einer „list comprehension” hätte man das ausserdem viel kompakter ausdrücken können: ``Z = [item for item in L1 if item not in L2]``

Re: Test ob Elemente einer Liste in einer anderen Liste

Verfasst: Samstag 1. März 2014, 16:44
von snafu
mathematik hat geschrieben:Wenn ich also eine Liste L1 und eine Liste L2 habe und nur die Elemente von L1 möchte, die nicht in L2 sind.

Code: Alles auswählen

>>> L1 = [1,2,3]
>>> L2 = [2,3,4]
>>> set(L1) - set(L2)
set([1])
Python hat sogar spezielle Literale für Sets. Wenn man möchte, kann man das daher auch so schreiben:

Code: Alles auswählen

>>> s1 = {1,2,3}
>>> s2 = {2,3,4}
>>> s1 - s2
set([1])
"L" bzw "s" dienen hier natürlich nur zu Demonstrationszwecken. In "echten" Programmen würde man da Bezeichnungen wählen, die nicht so eng an den Typen gebunden sind. Dann braucht man auch nichts mehr umzubenennen, wenn sich - wie hier - der Typ später mal ändert.

Achja, Set-Operationen sind nicht nur einfacher zu schreiben, sondern auch deutlich effizienter gegenüber einer Schleife.

Re: Test ob Elemente einer Liste in einer anderen Liste

Verfasst: Samstag 1. März 2014, 16:54
von derdon
Diese String-Literale werden übrigens erst ab Python 2.7 unterstützt. Muss man das eigentlich noch erwähnen oder benutzt mittlerweile keiner 2.6 mehr?

Re: Test ob Elemente einer Liste in einer anderen Liste

Verfasst: Samstag 1. März 2014, 17:09
von snafu
Naja, auf einigen Servern dürfte sicherlich noch Python 2.6 oder älter laufen.

Re: Test ob Elemente einer Liste in einer anderen Liste

Verfasst: Samstag 1. März 2014, 17:37
von BlackJack
Auf älteren NAS und sogar gar nicht so alten Xen-Servern wird man auch noch mit Python 2.4 beglückt.

Re: Test ob Elemente einer Liste in einer anderen Liste

Verfasst: Samstag 1. März 2014, 18:06
von mathematik
super vielen Dank euch! Jetzt läuft das ganze schon viel besser! :)