HOWTO · Python

Rückwärts iterieren in Python

In diesem Beitrag geht es um die Funktion und Methode, mit der Sie in Python rückwärts iterieren können.

Auf dieser Seite

Rückwärts zu iterieren bedeutet, eine Sequenz vom letzten bis zum ersten Element zu durchlaufen. Python bietet dafür mehrere Möglichkeiten. Welche die richtige ist, hängt davon ab, ob Sie nur die Werte benötigen, die Sequenz ändern möchten oder den ursprünglichen Index jedes Elements brauchen. Die folgenden Beispiele verwenden Listen; reversed() und Slicing funktionieren jedoch auch mit Zeichenketten und Tupeln.

Mit reversed() rückwärts iterieren

Verwenden Sie reversed(), wenn Sie eine Sequenz vom Ende zum Anfang durchlaufen möchten, ohne sie zu verändern. Die Funktion liefert einen Iterator und erstellt daher keine zweite Liste mit den Werten. Die ursprüngliche Liste behält ihre Reihenfolge.

Führen Sie dieses Beispiel aus:

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

items = ["first", "second", "third"]
for item in reversed(items):
    print(item)
third
second
first

Das ist eine gute Standardwahl, wenn Sie die Werte einer Sequenz lediglich in umgekehrter Reihenfolge verarbeiten möchten. Während die Schleife fortschreitet, wird der Iterator aufgebraucht. Wenn Sie ihn erneut durchlaufen müssen, rufen Sie reversed(items) noch einmal auf. Die Sequenz muss umgekehrte Iteration unterstützen.

Mit range() in Python rückwärts iterieren

Verwenden Sie range(), wenn die Schleife numerische Positionen benötigt, etwa um Elemente anhand ihres Index zu ändern. Die Argumente lauten range(start, stop, step). Bei einem negativen Schritt wird heruntergezählt; der Stoppwert ist ausgeschlossen. Zum Beispiel liefert range(10, 0, -1) die Werte 10 bis 1, während range(10, -1, -1) die Werte 10 bis 0 liefert.

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

items = ["first", "second", "third"]
for index in range(len(items) - 1, -1, -1):
    print(index, items[index])

Der erste Index ist len(items) - 1, also die letzte gültige Position. Der Stoppwert ist -1, damit die Schleife den Index 0 einschließt und erst danach endet. Ein häufiger Fehler ist range(len(items) - 1, 0, -1): Dabei wird der Index 0 ausgelassen, weil range() den Stoppwert nie einschließt.

Eine Sequenz mit Slicing umkehren

Ein Slice mit dem Schritt -1, geschrieben als items[::-1], erstellt eine neue Liste mit den Elementen in umgekehrter Reihenfolge. Sie können diese Liste anschließend durchlaufen oder für eine spätere Verwendung aufbewahren.

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

items = ["first", "second", "third"]
backward = items[::-1]
print(backward)

Anders als reversed() erstellt Slicing eine umgekehrte Kopie. Das ist nützlich, wenn Sie die umgekehrten Werte behalten möchten, benötigt aber zusätzlichen Speicher proportional zur Länge der Sequenz. Wählen Sie reversed(), wenn Sie die Elemente nur durchlaufen wollen, und Slicing, wenn Sie eine separate Sequenz in umgekehrter Reihenfolge benötigen.

Eine while-Schleife verwenden

Eine while-Schleife bietet direkte Kontrolle über den Index und darüber, was zwischen den Durchläufen geschieht. Beginnen Sie beim letzten gültigen Index, verarbeiten Sie das Element und verringern Sie anschließend den Index. Achten Sie darauf, dass die Schleifenbedingung den Index 0 einschließt und sich der Index bei jedem Durchlauf ändert. Andernfalls kann die Schleife zu früh enden oder nicht mehr fortschreiten.

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

items = ["first", "second", "third"]
index = len(items) - 1
while index >= 0:
    print(items[index])
    index -= 1

Dieses Muster ist nützlich, wenn die Abbruchbedingung der Schleife oder die Indexänderungen Teil eines größeren Algorithmus sind. Für einen einfachen Durchlauf in umgekehrter Reihenfolge ist reversed() meist kürzer und macht die Absicht deutlicher. Die while-Variante funktioniert auch bei einer leeren Liste: Ihr anfänglicher Index ist -1, daher wird der Schleifenrumpf nicht ausgeführt.

Ursprüngliche Indizes mit enumerate() beibehalten

enumerate() zählt beim Durchlaufen eines Iterables normalerweise ab null. Um Werte in umgekehrter Reihenfolge mit ihren Positionen in der ursprünglichen Liste zu verknüpfen, verwenden Sie enumerate(reversed(items)) und rechnen jeden Rückwärtsversatz in einen ursprünglichen Index um.

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

items = ["first", "second", "third"]
for reverse_offset, item in enumerate(reversed(items)):
    original_index = len(items) - 1 - reverse_offset
    print(original_index, item)

Der erste Rückwärtsversatz ist 0 und entspricht dem letzten ursprünglichen Index. Jeder folgende Versatz entspricht einer Position weiter vorne. So müssen Sie keine umgekehrte Liste erstellen. Das ist praktisch, wenn Sie sowohl die Werte als auch ihre ursprünglichen Positionen benötigen. Wenn Sie einen Index nur für eine Suche oder Zuweisung brauchen, ist das Muster mit range() direkter.

Eine Methode auswählen

Verwenden Sie reversed(sequence) für einen klaren, speichersparenden Durchlauf der Werte in umgekehrter Reihenfolge. Verwenden Sie range(len(sequence) - 1, -1, -1), wenn die Schleife mit Indizes arbeiten muss. Verwenden Sie sequence[::-1], wenn Sie eine separate umgekehrte Kopie benötigen und der zusätzliche Speicher akzeptabel ist. Verwenden Sie eine while-Schleife, wenn eine individuelle Indexsteuerung für den Algorithmus wichtig ist. Kombinieren Sie enumerate(reversed(sequence)) mit einer Indexberechnung, wenn Sie Werte in umgekehrter Reihenfolge samt ihren ursprünglichen Positionen benötigen.

Für Zeichenketten gelten dieselben Möglichkeiten, da eine Zeichenkette eine Sequenz ist: reversed(text) durchläuft ihre Zeichen rückwärts, während text[::-1] eine umgekehrte Zeichenkette erstellt. Diese Verfahren beziehen sich auf die Reihenfolge von Sequenzen; gehen Sie nicht davon aus, dass sie eine allgemeine Rückwärtsiteration für jeden Container ermöglichen. Wählen Sie die Methode, die den Anforderungen der Schleife entspricht, und berücksichtigen Sie, ob sie eine Kopie erstellt oder ursprüngliche Indizes verfügbar macht.