Mit Indizes in Python rückwärts schleifen?


286

Ich versuche, eine Schleife von 100 auf 0 zu erstellen. Wie mache ich das in Python?

for i in range (100,0) funktioniert nicht


9
Übrigens möchten Sie wahrscheinlich eine Schleife von 99 bis 0 und selten von 100 bis 0 durchführen. Dies wirkt sich auf die Antworten aus.
Acumenus

1
@Acumenus Genau das habe ich gesucht, als ich hier ankam. Und für die Aufzeichnung besteht die Lösung darin, einfach zu schreiben: range(100)[::-1](was automatisch übersetzt wird range(9, -1, -1)) - Getestet in Python 3.7
Hassan

Antworten:


398

Versuchen Sie range(100,-1,-1), das dritte Argument ist das zu verwendende Inkrement ( hier dokumentiert ).

("Range" -Optionen, Start, Stopp, Schritt sind hier dokumentiert )


3
Außerdem muss ich dies verwenden, um Elemente aus der Sammlung zu löschen. Deshalb wollte ich nur die Indizes.
Joan Venge

2
Das zweite Argument ist eins weniger als der Endwert. Wenn Sie also -1 setzen, stoppt der Bereich bei 0, wenn Sie -5 setzen, stoppt der Bereich bei -4 (für ein Inkrement von -1)
Mulllhausen

200

Meiner Meinung nach ist dies am besten lesbar:

for i in reversed(xrange(101)):
    print i,

14
Dies ist besser als die akzeptierte Antwort, da nicht alle Nummern im Speicher zugewiesen werden (in Python 3 würde die akzeptierte Antwort auch nicht), und es ist offensichtlicher, was passiert.
Blixt

5
Python vor 2.6 weist alle Zahlen zu, da umgekehrt den xrange nicht anweisen kann, rückwärts zu gehen ... (Seit Python 2.6 wird __reversed __ () aufgerufen.)
Robert Siemer

Ich ziehe reversed(xrange(len(list)))es vor xrange(len(list)-1:-1:-1); Letzteres sieht bei so vielen einfach komisch aus -1.
Musiphil

1
xrange () ist nicht mehr verfügbar in Python 3
Chris Graf

1
In Python 3 rangeverhält es sich genauso xrangewie in 2.7. @hacksoi hängt vom Anwendungsfall ab, aber nehmen wir an, Sie iterieren in einem großen Puffer rückwärts, sagen wir, es sind 10 MB. Dann würde das Erstellen der umgekehrten Indizes im Voraus Sekunden dauern und über 50 MB Speicher verbrauchen. Die Verwendung eines umgekehrten Generators würde Millisekunden dauern und nur wenige Bytes Speicher verbrauchen.
Blixt

34
for i in range(100, -1, -1)

und etwas längere (und langsamere) Lösung:

for i in reversed(range(101))

for i in range(101)[::-1]

16

Im Allgemeinen können Sie in Python negative Indizes verwenden, um von hinten zu beginnen:

numbers = [10, 20, 30, 40, 50]
for i in xrange(len(numbers)):
    print numbers[-i - 1]

Ergebnis:

50
40
30
20
10

8

Warum Ihr Code nicht funktioniert hat

Ihr Code for i in range (100, 0)ist in Ordnung, außer

Der dritte Parameter ( step) ist standardmäßig +1. Sie müssen also den dritten Parameter für range () angeben, -1um einen Schritt zurück zu machen.

for i in range(100, -1, -1):
    print(i)

HINWEIS: Dies beinhaltet 100 & 0 in der Ausgabe.

Es gibt mehrere Möglichkeiten.

Besserer Weg

Überprüfen Sie für pythonische Weise PEP 0322 .

Dies ist ein Python3-Python-Beispiel zum Drucken von 100 bis 0 (einschließlich 100 und 0).

for i in reversed(range(101)):
    print(i)

1
Ja, PEP-322 bietet uns eine klare und am wenigsten fehleranfällige Möglichkeit, Iterationen umzukehren.
Allen Shen

1
Das ist gut. Die Empfehlung zur Implementierung reversedin PEP-322 ist irreführend. Daher sollte beachtet werden, dass das iterable reversedaufgerufen wird __reversed__und das Ergebnis zurückgegeben wird. Für rangeObjekte ist dies ein verzögert ausgewerteter range_objectIterator. Kurzum: Die Verwendung dieser Methode ist immer noch eine träge Bewertung.
Ruzihm

5

Eine andere Lösung:

z = 10
for x in range (z):
   y = z-x
   print y

Ergebnis:

10
9
8
7
6
5
4
3
2
1

Tipp: Wenn Sie diese Methode verwenden, um Indizes in einer Liste zurückzuzählen, möchten Sie -1 vom Wert 'y' abziehen, da Ihre Listenindizes bei 0 beginnen.


3

Die einfache Antwort zur Lösung Ihres Problems könnte folgendermaßen aussehen:

for i in range(100):
    k = 100 - i
    print(k)


1

Kurz und bündig. Dies war meine Lösung beim CodeAcademy-Kurs. Druckt eine Zeichenfolge in Umdrehungsreihenfolge.

def reverse(text):
    string = ""
    for i in range(len(text)-1,-1,-1):
        string += text[i]
    return string    

1

Sie können jederzeit zu erhöhen Bereich tun und aus einer Variablen in Ihrem Fall subtrahieren 100 - iwo i in range( 0, 101 ).

for i in range( 0, 101 ):
    print 100 - i

0

Ich habe dies in einer der Codeacademy-Übungen versucht (Zeichen in einer Zeichenfolge umkehren, ohne umgekehrt oder :: -1 zu verwenden)

def reverse(text):
    chars= []
    l = len(text)
    last = l-1
    for i in range (l):
        chars.append(text[last])
        last-=1

    result= ""   
    for c in chars:
        result += c
    return result
print reverse('hola')

0

Ich wollte zwei Listen gleichzeitig rückwärts durchlaufen, also brauchte ich den negativen Index. Das ist meine Lösung:

a= [1,3,4,5,2]
for i in range(-1, -len(a), -1):
    print(i, a[i])

Ergebnis:

-1 2
-2 5
-3 4
-4 3
-5 1

0

Oh, okay, lesen Sie die Frage falsch, ich denke, es geht darum, in einem Array rückwärts zu gehen? wenn ja, habe ich folgendes:

array = ["ty", "rogers", "smith", "davis", "tony", "jack", "john", "jill", "harry", "tom", "jane", "hilary", "jackson", "andrew", "george", "rachel"]


counter = 0   

for loop in range(len(array)):
    if loop <= len(array):
        counter = -1
        reverseEngineering = loop + counter
        print(array[reverseEngineering])

Es sieht so aus, als ob Ihre Antwort das Kopieren und Einfügen des von Ihnen durchgeführten Tests ist. Bitte versuchen Sie, ein minimales Beispiel zu veröffentlichen: Die Verwendung von globalund timeist für die ursprüngliche Frage nicht relevant.
Michael Doubez

-1

Sie können auch einen benutzerdefinierten Umkehrmechanismus in Python erstellen. Welches kann überall verwendet werden, um eine iterable rückwärts zu schleifen

class Reverse:
    """Iterator for looping over a sequence backwards"""
    def __init__(self, seq):
        self.seq = seq
        self.index = len(seq)

    def __iter__(self):
        return self

    def __next__(self):
        if self.index == 0:
            raise StopIteration
        self.index -= 1
        return self.seq[self.index]


>>> d = [1,2,3,4,5]
>>> for i in Reverse(d):
...   print(i)
... 
5
4
3
2
1

-2
a = 10
for i in sorted(range(a), reverse=True):
    print i

Willkommen bei Stack Overflow! Bitte überlegen Sie, Ihren Beitrag zu bearbeiten, um weitere Erklärungen darüber zu erhalten, was Ihr Code tut und warum er das Problem löst. Eine Antwort, die meistens nur Code enthält (auch wenn sie funktioniert), hilft dem OP normalerweise nicht, ihr Problem zu verstehen.
SuperBiasedMan

Sie erkennen, dass die Verwendung sortedunnötig die gesamte Liste im Speicher speichert, oder? Dies ist verschwenderisch und für große nicht machbar a.
Acumenus
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.