Ü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 )
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)
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]
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 =10for x in range (z):
y = z-x
print y
Ergebnis:
10987654321
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.
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-1for i in range (l):
chars.append(text[last])
last-=1
result=""for c in chars:
result += c
return result
print reverse('hola')
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
classReverse:"""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:raiseStopIteration
self.index -=1return self.seq[self.index]>>> d =[1,2,3,4,5]>>>for i inReverse(d):...print(i)...54321
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.
range(100)[::-1]
(was automatisch übersetzt wirdrange(9, -1, -1)
) - Getestet in Python 3.7Antworten:
Versuchen Sie
range(100,-1,-1)
, das dritte Argument ist das zu verwendende Inkrement ( hier dokumentiert ).("Range" -Optionen, Start, Stopp, Schritt sind hier dokumentiert )
quelle
Meiner Meinung nach ist dies am besten lesbar:
quelle
reversed(xrange(len(list)))
es vorxrange(len(list)-1:-1:-1)
; Letzteres sieht bei so vielen einfach komisch aus-1
.range
verhält es sich genausoxrange
wie 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.und etwas längere (und langsamere) Lösung:
quelle
Im Allgemeinen können Sie in Python negative Indizes verwenden, um von hinten zu beginnen:
Ergebnis:
quelle
Warum Ihr Code nicht funktioniert hat
Ihr Code
for i in range (100, 0)
ist in Ordnung, außerDer dritte Parameter (
step
) ist standardmäßig+1
. Sie müssen also den dritten Parameter für range () angeben,-1
um einen Schritt zurück zu machen.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).
quelle
reversed
in PEP-322 ist irreführend. Daher sollte beachtet werden, dass das iterablereversed
aufgerufen wird__reversed__
und das Ergebnis zurückgegeben wird. Fürrange
Objekte ist dies ein verzögert ausgewerteterrange_object
Iterator. Kurzum: Die Verwendung dieser Methode ist immer noch eine träge Bewertung.Eine andere Lösung:
Ergebnis:
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.
quelle
Die einfache Antwort zur Lösung Ihres Problems könnte folgendermaßen aussehen:
quelle
for var in range(10,-1,-1)
funktioniertquelle
Kurz und bündig. Dies war meine Lösung beim CodeAcademy-Kurs. Druckt eine Zeichenfolge in Umdrehungsreihenfolge.
quelle
Sie können jederzeit zu erhöhen Bereich tun und aus einer Variablen in Ihrem Fall subtrahieren
100 - i
woi in range( 0, 101 )
.quelle
Ich habe dies in einer der Codeacademy-Übungen versucht (Zeichen in einer Zeichenfolge umkehren, ohne umgekehrt oder :: -1 zu verwenden)
quelle
Ich wollte zwei Listen gleichzeitig rückwärts durchlaufen, also brauchte ich den negativen Index. Das ist meine Lösung:
Ergebnis:
quelle
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:
quelle
global
undtime
ist für die ursprüngliche Frage nicht relevant.Sie können auch einen benutzerdefinierten Umkehrmechanismus in Python erstellen. Welches kann überall verwendet werden, um eine iterable rückwärts zu schleifen
quelle
quelle
sorted
unnötig die gesamte Liste im Speicher speichert, oder? Dies ist verschwenderisch und für große nicht machbara
.