使用する filterfalse
ohne lambda-Ausdruck
Bei der Verwendung von Funktionen wie filter
o filterfalse
und ähnliches aus itertools
können Sie in der Regel Leistung sparen, indem Sie die lambda
-Ausdrücke und die Verwendung bereits vorhandener Funktionen. Instanzen von list
y set
definiert eine __contains__
-Methode, die für Einschließungsprüfungen zu verwenden ist. Die in
-Operator ruft diese Methode unter der Haube auf, so dass die Verwendung von x in l2
kann ersetzt werden durch l2.__contains__(x)
. Normalerweise ist dieser Ersatz nicht wirklich schöner, aber in diesem speziellen Fall ermöglicht er uns eine bessere Leistung als die Verwendung einer lambda
-Ausdruck, wenn er in Kombination mit filterfalse
:
>>> from itertools import filterfalse
>>> l1 = [1, 2, 6, 8]
>>> l2 = [2, 3, 5, 8]
>>> list(filterfalse(l2.__contains__, l1))
[1, 6]
filterfalse
erzeugt einen Iterator, der alle Elemente liefert, die false
bei Verwendung als Argument für l2.__contains__
.
Sets hat eine schnellere Implementierung von __contains__
also noch besser ist:
>>> from itertools import filterfalse
>>> l1 = [1, 2, 6, 8]
>>> l2 = set([2, 3, 5, 8])
>>> list(filterfalse(l2.__contains__, l1))
[1, 6]
Leistung
Liste verwenden:
$ python3 -m timeit -s "from itertools import filterfalse; l1 = [1,2,6,8]; l2 = set([2,3,5,8]);" "list(filterfalse(l2.__contains__, l1))"
500000 loops, best of 5: 522 nsec per loop
Set verwenden:
$ python3 -m timeit -s "from itertools import filterfalse; l1 = [1,2,6,8]; l2 = set([2,3,5,8]);" "list(filterfalse(l2.__contains__, l1))"
1000000 loops, best of 5: 359 nsec per loop
28 Stimmen
Nur ein Tipp: PEP8 besagt, dass das kleine "L" nicht verwendet werden sollte, weil es zu sehr wie eine 1 aussieht.
3 Stimmen
Ich stimme zu. Ich habe diese ganze Frage und die Antworten gelesen und mich gefragt, warum die Leute immer wieder elf und zwölf verwenden. Erst als ich den Kommentar von @spelchekr las, ergab es einen Sinn.
1 Stimmen
Mögliches Duplikat von Löschen von Zeilen aus einem Datenrahmen auf der Grundlage einer "nicht in"-Bedingung
3 Stimmen
@JimG. Datenrahmen und Liste sind nicht dasselbe.
3 Stimmen
Diese Frage ist nicht klar definiert. Listen erlauben doppelte Einträge. Sollte [1, 1, 2, 3] - [1, 2] [1, 3] oder nur [3] ergeben? Die nachstehenden Lösungen scheinen alle davon auszugehen, dass [3] zurückgegeben werden sollte, d. h. dass alle Elemente, die mit einem Element der zweiten Liste übereinstimmen, aus der ersten Liste entfernt werden sollten. Manchmal müssen Listenoperationen algebraischen Eigenschaften gehorchen. Wenn A - B = C, dann C + B = A. Das ist hier nicht der Fall, da doppelte Werte verloren gehen.
0 Stimmen
Siehe auch: Wie findet man Listenschnittpunkte? . (Diese Frage ist für die Liste Unterschied was gleichbedeutend ist mit dem Entfernen der Schnittmenge aus der ersten Eingabe).