Wenn man die Antwort von Donut und die anderen Antworten hier weiter ausführt, kann man sogar noch bessere Ergebnisse erzielen, indem man ein Generator-Verständnis anstelle eines Listen-Verständnisses verwendet, und indem man ein set
Datenstruktur (da die in
Operator ist O(n) für eine Liste, aber O(1) für eine Menge).
Hier ist also eine Funktion, die für Sie geeignet wäre:
def filter_list(full_list, excludes):
s = set(excludes)
return (x for x in full_list if x not in s)
Das Ergebnis wird eine Iterable sein, die die gefilterte Liste nach und nach abruft. Wenn Sie ein echtes Listenobjekt benötigen (z.B. wenn Sie eine len()
auf das Ergebnis), dann können Sie leicht eine Liste wie folgt erstellen:
filtered_list = list(filter_list(full_list, excludes))
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).