Test ob Elemente einer Liste in einer anderen Liste

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
mathematik
User
Beiträge: 28
Registriert: Dienstag 16. April 2013, 12:40

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!
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]``
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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.
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

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?
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Naja, auf einigen Servern dürfte sicherlich noch Python 2.6 oder älter laufen.
BlackJack

Auf älteren NAS und sogar gar nicht so alten Xen-Servern wird man auch noch mit Python 2.4 beglückt.
mathematik
User
Beiträge: 28
Registriert: Dienstag 16. April 2013, 12:40

super vielen Dank euch! Jetzt läuft das ganze schon viel besser! :)
Antworten