HOWTO · Python
Überprüfen Sie, ob der Index in der Python-Liste vorhanden ist
Dieses Tutorial zeigt, ob ein Index in der Python-Liste vorhanden ist, indem Sie den Listenbereich und die IndexError-Ausnahme verwenden
Auf dieser Seite
Python-Listen verwenden eine nullbasierte Indizierung: Das erste Element steht am Index 0. Prüfen Sie bei einem nichtnegativen Index vor dem Zugriff 0 <= index < len(items). Wenn Sie ein Element bereits abrufen möchten, fangen Sie IndexError direkt beim Zugriff ab. Python akzeptiert auch Indizes, die vom Ende der Liste aus zählen. Der gesamte gültige Bereich reicht daher von -len(items) bis len(items) - 1.
Einen Index mit einer Bereichsprüfung prüfen
Verwenden Sie eine Bereichsprüfung, wenn Sie einen Index validieren möchten, bevor Sie auf eine Liste zugreifen oder sie ändern. Die Prüfung 0 <= index < len(items) schließt den ersten Index ein und die Listenlänge aus, denn len(items) liegt eine Position hinter dem letzten Element.
Führen Sie dieses Beispiel aus:
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
items = ["Apple", "Banana", "Pineapple"]
index = 1
if 0 <= index < len(items):
print(f"{items[index]} is at index {index}.")
else:
print(f"No item at index {index}.")
Banana is at index 1.
Diese Prüfung ist übersichtlich, wenn ein nichtnegativer, ganzzahliger Index erwartet wird. Der Vergleich prüft nur, ob der Wert im Bereich liegt; er stellt nicht sicher, dass der Wert ein gültiger Listenindex ist. Zum Beispiel erfüllt 1.0 die Bedingung 0 <= index < len(items), aber items[1.0] löst TypeError aus. Prüfen Sie den Typ des Index separat, bevor Sie ein positives Prüfergebnis als Beleg dafür ansehen, dass der Zugriff funktioniert. Diese Prüfung akzeptiert außerdem keine negativen Indizes, obwohl Python sie beim Listenzugriff zulässt. Wenn Aufrufer negative Werte übergeben können, verwenden Sie den vollständigen Bereich in der weiter unten gezeigten Hilfsfunktion oder normalisieren Sie den Index entsprechend den Anforderungen Ihrer Anwendung.
Die Bedingung ergibt False, wenn der Index außerhalb der Liste liegt. Dieses Beispiel zeigt beide Ergebnisse für dieselbe Liste mit drei Elementen. Der unveränderte Code und die Ausgabe zeigen englische Bezeichnungen; diese bleiben im Beispiel auf Englisch:
items = ["Apple", "Banana", "Pineapple"]
for index in (1, 3):
if 0 <= index < len(items):
print(f"{index}: {items[index]}")
else:
print(f"{index}: no item")
1: Banana
3: no item
Einen Index abfangen, indem Sie IndexError behandeln
Wenn Sie das Element abrufen möchten, versuchen Sie den Zugriff und behandeln Sie IndexError. Halten Sie den try-Block kurz, damit der Handler nur den Vorgang abdeckt, der diesen Indexierungsfehler auslösen kann. Andere Fehler, etwa ein TypeError bei einem Index, der keine Ganzzahl ist, werden von diesem Handler nicht abgefangen.
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
items = ["Apple", "Banana", "Pineapple"]
index = 2
try:
item = items[index]
except IndexError:
print("No item at that index.")
else:
print(f"Found {item} at index {index}.")
Found Pineapple at index 2.
Dieses Muster prüft den Zugriff und ruft den Wert in einem Schritt ab. Eine separate Bereichsprüfung garantiert nicht, dass ein späterer Zugriff gelingt, falls ein anderer Programmteil die Liste zwischen Prüfung und Verwendung verändert. Wenn das möglich ist, fangen Sie den Zugriffsfehler direkt beim Zugriff ab.
Das Beispiel zeigt, wie der Handler auf einen Index reagiert, der hinter der letzten Position liegt. Die Bezeichnungen im unveränderten Code und in der Ausgabe bleiben Englisch:
items = ["Apple", "Banana", "Pineapple"]
index = 3
try:
item = items[index]
except IndexError:
print(f"No item at index {index}.")
No item at index 3.
Eine wiederverwendbare Indexprüfung erstellen
Fassen Sie den vollständigen Listenindexbereich in einer Hilfsfunktion zusammen, wenn Sie dieselbe Prüfung an mehreren Stellen benötigen. Bei einer Liste der Länge n akzeptiert Python Indizes von -n bis, aber nicht einschließlich, n.
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
def index_exists(items, index):
return -len(items) <= index < len(items)
fruits = ["Apple", "Banana", "Pineapple"]
for index in (2, -1, 3, -4):
print(f"{index}: {index_exists(fruits, index)}")
2: True
-1: True
3: False
-4: False
Die Hilfsfunktion setzt einen ganzzahligen Index voraus und prüft nur dessen Bereich, einschließlich gültiger negativer Indizes. Eine Gleitkommazahl wie 1.0 kann diesen Vergleich bestehen, obwohl items[1.0] TypeError auslöst. Prüfen Sie den Indextyp separat, bevor Sie True als Beleg dafür ansehen, dass der Zugriff funktioniert. Verwenden Sie nach einem positiven Ergebnis items[index], um das Element abzurufen. Kann sich die Liste zwischen Prüfung und Zugriff ändern, kann das Prüfergebnis veralten; verwenden Sie stattdessen einen try-Block um den Zugriff. Die englischen Bezeichnungen im unveränderten Beispielcode und in der Ausgabe bleiben Englisch.
Negative und ungültige Indizes behandeln
Negative Indizes zählen vom Listenende zurück: -1 bezeichnet das letzte Element und -len(items) das erste. Eine leere Liste hat keinen gültigen Index, denn ihre Länge ist null und es gibt keine Ganzzahl im Bereich von einschließlich -0 bis ausschließlich 0. Werte außerhalb des gültigen Bereichs lösen beim Zugriff auf eine Liste IndexError aus.
Indizes müssen außerdem ganzzahlig sein. Eine Gleitkommazahl wie 1.0 kann einen Bereichsvergleich bestehen, ist aber kein gültiger Listenindex und löst beim Zugriff TypeError aus. Auch eine Zeichenkette ist kein gültiger Listenindex. Wenn Sie nur IndexError abfangen, behandeln Sie diese Typfehler nicht. Nimmt Ihre Funktion Daten von außerhalb Ihres Codes entgegen, prüfen Sie den Typ separat, bevor Sie sich auf eine Bereichsprüfung verlassen, oder behandeln Sie genau die Fehler, die Ihre Schnittstelle abfangen soll. Wandeln Sie beliebige Werte nicht in Ganzzahlen um, ohne zuvor zu entscheiden, ob Abschneiden oder Einlesen der Absicht des Aufrufers entspricht.
Den passenden Ansatz wählen
Verwenden Sie eine Bereichsprüfung, wenn Sie vor dem Zugriff auf einen nichtnegativen Index verzweigen möchten. Gehören negative Indizes zur Schnittstelle, prüfen Sie den vollständigen Bereich von negativ bis positiv. Verwenden Sie try/except IndexError, wenn der Zugriff selbst der gewünschte Vorgang ist und Sie darauf reagieren möchten, falls kein Element vorhanden ist. Eine wiederverwendbare Hilfsfunktion ist sinnvoll, wenn dieselbe Bereichsprüfung mehrfach benötigt wird. Sie ruft jedoch kein Element ab und schützt einen späteren Zugriff nicht vor Änderungen an der Liste.
IndexError weist ausdrücklich darauf hin, dass ein ganzzahliger Index außerhalb der verfügbaren Listenpositionen liegt. Bei einem nichtganzzahligen Index wird TypeError ausgelöst. Behalten Sie diesen Unterschied im Blick, wenn Sie nicht vertrauenswürdige Eingaben prüfen. So können Sie zwischen einer Prüfung vorab und dem Behandeln eines Fehlers beim Zugriff wählen.