HOWTO · Python

Alle Vorkommen eines Elements aus einer Liste in Python entfernen

In diesem Artikel werden wir sehen, wie wir alle Vorkommen eines Elements aus einer Liste in Python entfernen können.

Auf dieser Seite

Eine Python-Liste kann denselben Wert mehrfach speichern, und jedes Vorkommen ist ein eigenständiges Element an einer eigenen Position in der Liste. remove() löscht nur den ersten Treffer. Wenn Sie jedes Vorkommen eines Werts entfernen möchten, brauchen Sie daher einen anderen Ansatz. Die direkteste Option ist eine List Comprehension, die eine neue Liste mit nur den gewünschten Elementen erstellt. filter() bietet eine prädikatsbasierte Alternative, und eine Schleife um remove() eignet sich, wenn die ursprüngliche Liste an Ort und Stelle verändert werden muss.

Alle passenden Elemente mit einer List Comprehension entfernen

Eine List Comprehension behält jedes Element, das eine Bedingung erfüllt, und sammelt die verbleibenden Elemente in einer neuen Liste. Führen Sie dieses Beispiel aus:

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

numbers = [1, 2, 3, 4, 2, 5, 2]
target = 2
filtered = [x for x in numbers if x != target]
print(filtered)
print(numbers)
[1, 3, 4, 5]
[1, 2, 3, 4, 2, 5, 2]

Die Bedingung x != target behält jeden Wert, der nicht 2 ist. Daher verschwinden alle drei Vorkommen aus filtered, während numbers weiterhin die ursprünglichen Daten enthält. Um die ursprüngliche Variable zu ersetzen, statt zwei Listen zu behalten, weisen Sie ihr das Ergebnis erneut zu: numbers = [x for x in numbers if x != target]. Andere Namen, die an dasselbe alte Listenobjekt gebunden sind, sehen weiterhin die ungefilterten Elemente; das ist meist erwünscht, wenn der Aufrufer Eigentümer der Liste ist.

Wenn der Wert nie in der Liste vorkommt, läuft die Comprehension trotzdem und erzeugt eine Liste mit allen ursprünglichen Elementen:

numbers = [1, 3, 4, 5]
target = 2
filtered = [x for x in numbers if x != target]
print(filtered)
[1, 3, 4, 5]

Dadurch kann die Comprehension sicher ausgeführt werden, ohne vorher die Mitgliedschaft zu prüfen.

Alle passenden Elemente mit filter() entfernen

Die Funktion filter() wendet ein Prädikat auf jedes Element an und liefert nur die Elemente, für die das Prädikat wahr ist. In Python 3 gibt sie einen Iterator und keine Liste zurück. Übergeben Sie das Ergebnis daher an list(), wenn Sie eine wiederverwendbare Liste benötigen. Das Prädikat ist häufig ein lambda, also eine kleine anonyme Funktion, die jedes Element mit dem Zielwert vergleicht:

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

numbers = [1, 2, 3, 4, 2, 5, 2]
target = 2
filtered = list(filter(lambda x: x != target, numbers))
print(filtered)
[1, 3, 4, 5]

Wie die Comprehension erstellt filter() eine neue Sequenz und lässt numbers unverändert. Ein Zielwert, der nie vorkommt, erzeugt eine Liste, die der Eingabe entspricht. Verwenden Sie filter(), wenn bereits ein Prädikat vorhanden ist oder wiederverwendet werden soll. Bevorzugen Sie die Comprehension, wenn die Bedingung eine einmalige Prüfung wie x != target ist.

Alle passenden Elemente mit remove() entfernen

remove() ist eine Listenmethode, die nur das erste Element löscht, das ihrem Argument entspricht, und die Liste an Ort und Stelle verändert. Ein einzelner Aufruf kann Duplikate niemals vollständig entfernen. Wiederholen Sie ihn daher, solange der Wert noch vorhanden ist:

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

numbers = [1, 2, 3, 4, 2, 5, 2, 6]
target = 2
while target in numbers:
    numbers.remove(target)
print(numbers)
[1, 3, 4, 5, 6]

Jede Iteration durchsucht die Liste einmal für target in numbers und erneut innerhalb von remove(), um den ersten Treffer zu finden. Die Schleife führt also zwei Suchvorgänge pro gelöschtem Element aus. Die while-Bedingung ist gleichzeitig die Absicherung: Sobald kein Treffer mehr übrig ist, ist die Prüfung falsch und die Schleife endet. Der Aufruf von remove() mit einem Wert, der nicht in der Liste ist, löst ValueError aus. Daher macht die Mitgliedschaftsprüfung – oder eine entsprechende numbers.count(target)-Absicherung – das wiederholte Entfernen sicher. Wenn der Zielwert nie in der Liste war, wird der Schleifenkörper nie ausgeführt, und die Liste behält alle Elemente.

Den passenden Ansatz wählen

  • Sie benötigen eine gefilterte Kopie: Verwenden Sie eine List Comprehension. Sie durchläuft die Liste einmal, formuliert die Bedingung direkt im Ausdruck und lässt das Original unverändert.
  • Sie möchten ein Prädikat wiederverwenden: Verwenden Sie filter() mit lambda oder einer benannten Funktion. Das Ergebnis ist ein Iterator mit verzögerter Auswertung. Denken Sie daher an den Aufruf von list(), wenn Sie eine konkrete Liste benötigen.
  • Sie benötigen eine Veränderung an Ort und Stelle: Verwenden Sie die Schleife while ... remove(), wenn anderer Code die Änderung am selben Listenobjekt beobachten muss. Da jedes gelöschte Element eine Mitgliedschaftsprüfung und einen weiteren Suchvorgang zum Entfernen erfordert, leistet sie bei langen Listen mit vielen Treffern mehr Arbeit als die Comprehension mit einem einzigen Durchlauf.

Bei typischen Listengrößen ist die Comprehension die klarste Lösung und lässt sich am schnellsten schreiben. Die zusätzlichen Suchvorgänge der Schleife fallen erst auf, wenn Listen groß werden oder Entfernungen häufig ausgeführt werden.