HOWTO · Python
Fix ValueError: list.remove(x): X Not in List Error in Python
In diesem Tutorial lernen Sie, ValueError: list.remove(x): x not in list in Python zu beheben.
Auf dieser Seite
ValueError: list.remove(x): x not in list bedeutet, dass remove() keinen Wert gefunden hat, der dem übergebenen Wert entspricht. Die Liste kann sich seit der Prüfung geändert haben, der Wert kann anders sein als erwartet oder nie in der Liste gestanden haben. list.remove(x) entfernt einen Wert anhand seines Inhalts. Wenn Sie stattdessen ein Element an einer bekannten Position entfernen möchten, verwenden Sie del items[index] oder items.pop(index).
Warum list.remove(x) ValueError auslöst
remove() akzeptiert pro Aufruf einen Wert und entfernt das erste passende Vorkommen. Enthält die Liste Duplikate, bleiben weitere passende Vorkommen erhalten. Ein zweiter Aufruf für denselben Wert ist daher nur erfolgreich, wenn noch ein gleichwertiges Element vorhanden ist.
Das folgende kurze Beispiel lässt sich eigenständig ausführen, da die Liste im selben Codeblock definiert wird. Zunächst wird ein Wert erfolgreich entfernt; anschließend wird versucht, denselben Wert noch einmal zu entfernen. Die Code- und Ausgabeblöcke in diesem Abschnitt bleiben auf Englisch:
items = ["science", "maths", "computer", "english"]
items.remove("computer")
print(items)
Nach dem ersten Aufruf ist "computer" nicht mehr in items enthalten. Wird remove() dafür erneut aufgerufen, löst dies ValueError mit der Meldung list.remove(x): x not in list aus. Das folgende ausführbare Beispiel fängt den Fehler ab und zeigt seinen Typ und seine Meldung an, ohne das Skript zu beenden. Der Fehlertext im unveränderten Ausgabeblock bleibt auf Englisch:
items = ["science", "maths", "computer", "english"]
items.remove("computer")
try:
items.remove("computer")
except ValueError as error:
print(f"{type(error).__name__}: {error}")
Die Methode durchsucht die aktuelle Liste anhand eines Gleichheitsvergleichs. Bei Zeichenfolgen sind Groß- und Kleinschreibung sowie Leerzeichen relevant: "Computer" und "computer" sind unterschiedliche Werte. Bei benutzerdefinierten Objekten richtet sich der Gleichheitsvergleich nach der Implementierung von __eq__. Wenn ein Element scheinbar vorhanden ist, das Entfernen aber fehlschlägt, prüfen Sie die Liste unmittelbar vor dem Aufruf und vergleichen Sie den tatsächlichen Wert und Typ mit dem übergebenen Wert. Ein vorheriges Entfernen, ein Filterschritt oder eine andere Eingabe kann die Liste zwischenzeitlich verändern.
Prüfen, ob ein Element vor dem Entfernen vorhanden ist
Wenn der Wert fehlen könnte, prüfen Sie die Zugehörigkeit, bevor Sie remove() aufrufen. Auch der Operator in vergleicht Werte auf Gleichheit; die Prüfung folgt also derselben Vergleichsregel wie das Entfernen. Wenn Sie das Muster übernehmen, definieren Sie die Liste und den gesuchten Wert gemeinsam:
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
items = ["science", "maths", "english"]
item = "computer"
if item in items:
items.remove(item)
print(items)
Ist der Wert vorhanden, entfernt der abgesicherte Aufruf das erste passende Vorkommen. Fehlt er, wird der eingerückte Block übersprungen und die Liste bleibt unverändert. Das ist nützlich, wenn das Fehlen erwartet wird und keine Aktion nötig ist. Wenn ein fehlender Wert auf einen Programmierfehler hindeutet, kann das stille Überspringen die Ursache verschleiern. Prüfen Sie dann die Daten oder behandeln Sie den Fehler dort, wo die Liste erstellt wird.
Die Mitgliedschaftsprüfung und das Entfernen sind getrennte Vorgänge. In gewöhnlichem, einzeilig ausgeführtem Code ohne zwischenzeitliche Änderung beziehen sie sich auf denselben Listenstand. Kann ein anderer Programmteil die Liste zwischen Prüfung und Aufruf ändern, garantiert die Prüfung allein nicht, dass das Entfernen gelingt. Koordinieren Sie in diesem Fall den Zugriff oder behandeln Sie ValueError an der Stelle, an der der Fehler auftreten kann.
Mehrere Listenelemente sicher entfernen
Um mehrere Werte zu entfernen, von denen bekannt ist, dass sie vorhanden sind, rufen Sie remove() für jeden Wert einzeln auf. Die Methode akzeptiert nicht mehrere Werte in einem Aufruf. Das eigenständig ausführbare Beispiel entfernt nacheinander zwei Werte:
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
items = ["science", "maths", "computer", "english"]
items.remove("maths")
items.remove("english")
print(items)
Bei einer Sammlung von Werten, die entfernt werden sollen, durchlaufen Sie diese mit einer Schleife. Sichern Sie jeden Aufruf mit einer Prüfung ab, wenn ein angeforderter Wert fehlen könnte:
items = ["science", "maths", "computer", "english"]
requested = ["maths", "history", "english"]
for item in requested:
if item in items:
items.remove(item)
print(items)
Ohne die Mitgliedschaftsprüfung kann die Schleife beim ersten fehlenden Wert mit ValueError abbrechen; spätere Werte werden dann nicht verarbeitet. Die abgesicherte Variante überspringt fehlende Werte und fährt mit den übrigen fort. Beide Muster verändern die ursprüngliche Liste und entfernen pro angefordertem Wert nur ein Vorkommen. Möchten Sie stattdessen alle Elemente entfernen, die eine Bedingung erfüllen, erstellen Sie mit einer Listenkompression oder durch Filtern eine neue Liste. Wiederholte Aufrufe von remove() erfordern eine bewusst festgelegte Anzahl und Vergleichsregel.
Wählen Sie das Vorgehen, das zu Ihren Daten passt: Verwenden Sie einen direkten Aufruf, wenn der Wert sicher vorhanden ist, eine Mitgliedschaftsprüfung, wenn sein Fehlen normal ist, und eine ausdrückliche Fehlerbehandlung, wenn das Fehlen gemeldet werden soll. Prüfen Sie bei einem unerwarteten Fehler den aktuellen Inhalt der Liste.