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

Joan Venge
quelle
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 )

0x6adb015
quelle
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,
Triptychon
quelle
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]
kcwu
quelle
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
Blixt
quelle
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)
mythischer Kodierer
quelle
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.

Andy T.
quelle
3

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

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

for var in range(10,-1,-1) funktioniert

user2220115
quelle
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    
Mike
quelle
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
pnoob
quelle
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')
Tabula Rasa
quelle
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
Emanuel Lindström
quelle
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])
Darrell
quelle
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
Mohammed Wazeem
quelle
-2
a = 10
for i in sorted(range(a), reverse=True):
    print i
Boomba
quelle
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