Wie kann man folgende Liste mit erzeugen range()
in Python?
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
ramesh.mimit
Wie kann man folgende Liste mit erzeugen range()
in Python?
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
Michał Šrajer
verwenden reversed()
Funktion:
reversed(range(10))
Es ist viel aussagekräftiger.
Aktualisieren:
Wenn Sie möchten, dass es eine Liste ist (wie btk betonte):
list(reversed(range(10)))
Aktualisieren:
Wenn Sie nur verwenden möchten range
Um das gleiche Ergebnis zu erzielen, können Sie alle seine Parameter verwenden. range(start, stop, step)
Zum Beispiel, um eine Liste zu erstellen [5,4,3,2,1,0]
können Sie Folgendes verwenden:
range(5, -1, -1)
Es mag weniger intuitiv sein, aber wie in den Kommentaren erwähnt, ist dies effizienter und die richtige Verwendung des Bereichs für umgekehrte Listen.
Obwohl es weniger effizient ist. Und Sie können darauf keine Slicing-Operationen durchführen.
– Jakob Bowyer
2. September 2011 um 16:34 Uhr
Dies würde auch eine Liste von 8 bis 0 erzeugen, anstatt von 9 bis 0.
– Andreas Clark
2. September 2011 um 16:41 Uhr
Dadurch wird Speicher für den gesamten Bereich zugewiesen, was bei großen Bereichen oder wenn Sie nicht alle Werte benötigen, ineffizient ist. range(9, -1, -1)
oder xrange(9, -1, -1)
in Python 2 gibt Ihnen einen Iterator.
– Brice M. Dempsey
24. Oktober 2014 um 11:43 Uhr
Die Verwendung von “umgekehrt” mit dem Python-Generator (vorausgesetzt, wir sprechen von der integrierten Python 3-Reihe) ist einfach konzeptionell falsch und lehrt falsche Gewohnheiten, die Speicher-/Verarbeitungskomplexität beim Programmieren in Hochsprache nicht zu berücksichtigen.
– thedk
23. März 2015 um 9:16 Uhr
In Python3, reversed
akzeptiert keine Generatoren im Allgemeinen, aber es akzeptiert range
. Warum sollte reversed(range(10000))
Müssen Sie Speicher für die gesamte Liste zuweisen? range
kann ein Objekt zurückgeben, das die implementiert __reversed__
Methode, die eine effiziente umgekehrte Iteration ermöglicht?
– Avmohan
5. August 2017 um 10:45 Uhr
Verwenden Sie die integrierte Funktion „Range“. Die Unterschrift ist range(start, stop, step)
. Dies erzeugt eine Sequenz, die Zahlen ergibt, beginnend mit start
und endet mit if stop
erreicht ist, ausschließlich stop
.
>>> range(9,-1,-1)
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
>>> range(-2, 6, 2)
[-2, 0, 2, 4]
In Python 3 erzeugt dies eine Nicht-Liste range
-Objekt, das effektiv wie eine Nur-Lese-Liste funktioniert (aber viel weniger Speicher verbraucht, insbesondere für große Bereiche).
Können Sie das bitte auch erklären, können Sie mir auch eine Website/ein PDF-Buch für Python empfehlen
– ramesh.mimit
2. September 2011 um 16:21 Uhr
@ramesh Wenn du rennst help(range)
In einer Python-Shell werden Ihnen die Argumente mitgeteilt. Sie sind die Zahl, mit der begonnen werden soll, die Zahl, mit der geendet wird (ausschließlich) und der Schritt, der ausgeführt werden muss, also beginnt es bei 9 und subtrahiert 1, bis es -1 erreicht (an diesem Punkt stoppt es, ohne zurückzukehren, weshalb der Bereich endet bei 0)
– Michael Mrozek
2. September 2011 um 16:24 Uhr
@ramesh.mimit: Gehen Sie einfach auf die offizielle Python-Site. Es gibt dort eine vollständige Dokumentation, einschließlich eines großartigen Tutorials.
– Johannes Y
2. September 2011 um 16:55 Uhr
Wirklich, das ist die richtige Antwort, aber es könnte klarer erklärt werden. range(start, stop, step)
– Beginnen Sie mit der Nummer start
und liefern Ergebnisse, es sei denn stop
erreicht ist, bewegt sich vorbei step
jedes Mal.
– Herr B
4. Mai 2015 um 21:33 Uhr
Einfache Erklärung: Um rückwärts zu gehen, müssen Sie Ihre einstellen step
negativ sein (ein Minuszeichen hinzufügen) und Ihre start
größer sein als die stop
(start
ist dein Maximum, stop
ist dein Minimum).
– tsveti_iko
9. März um 15:16 Uhr
Martineau
Du könntest benutzen range(10)[::-1]
was dasselbe ist wie range(9, -1, -1)
und wohl besser lesbar (wenn Sie mit dem Common vertraut sind sequence[::-1]
Python-Idiom).
Wolf
Für diejenigen, die sich für die “Effizienz” der bisher gesammelten Optionen interessieren …
Die Antwort von Jaime RGP führte mich zu starten Sie meinen Computer neu nach zeitliche Koordinierung die etwas “herausfordernde” Lösung von Jason folgt wörtlich meinem eigenen Vorschlag (via Kommentar). Um den Neugierigen unter Ihnen die Ausfallzeit zu ersparen, präsentiere ich hier meine Ergebnisse (schlechteste zuerst):[1]
Jasons Antwort (vielleicht nur ein Ausflug in die Macht von Listenverständnis):
$ python -m timeit "[9-i for i in range(10)]"
1000000 loops, best of 3: 1.54 usec per loop
Martineaus Antwort (lesbar, wenn Sie mit der erweiterte Slices-Syntax):
$ python -m timeit "range(10)[::-1]"
1000000 loops, best of 3: 0.743 usec per loop
Die Antwort von Michał Šrajer (die akzeptierte, sehr lesbar):
$ python -m timeit "reversed(range(10))"
1000000 loops, best of 3: 0.538 usec per loop
bene’s Antwort (die allererste, aber damals sehr lückenhaft):
$ python -m timeit "range(9,-1,-1)"
1000000 loops, best of 3: 0.401 usec per loop
Die letzte Option kann man sich leicht merken, indem man die verwendet range(n-1,-1,-1)
Notation von Val Neekman.
[1] Wie von Karl Knechtel kommentiert, sind die hier präsentierten Ergebnisse versionsabhängig und beziehen sich auf die zum Zeitpunkt der Beantwortung dieser Frage stabile Python-3.x-Version.
Andrij Iwanejko
reverse
weil die range
Funktion kann umgekehrte Liste zurückgeben.Wenn Sie die Iteration beendet haben n Elemente und möchten die Reihenfolge der zurückgegebenen Liste ersetzen durch range(start, stop, step)
musst du verwenden dritter Parameter Bereich, der identifiziert step
und stelle es ein -1
andere Parameter sind entsprechend anzupassen:
stop
Parameter als -1
(es ist der vorherige Wert von stop - 1
, stop
gleich war 0
).n-1
.Also gleichbedeutend mit range(n)
in umgekehrter Reihenfolge wäre:
n = 10
print range(n-1,-1,-1)
#[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
Ehrlich gesagt finde ich das weniger intuitiv als reversed(range(n))
– Nicolas Hamilton
11. Januar 2017 um 8:33 Uhr
@NicholasHamilton Stimme dir zu, aber die Idee hinter dieser Antwort ist, weniger Ressourcen zu verbrauchen … (und die Frage war, nur die Bereichsfunktion zu verwenden :))
– Andriy Ivaneyko
11. Januar 2017 um 9:12 Uhr
Ok, keine Sorge, ich denke, es kommt auf die Situation an. Wenn beispielsweise die Bereichsfunktion als Index für eine Schleife verwendet wird, hat sie nur begrenzte Auswirkungen. Wenn sie jedoch innerhalb einer externen Schleife verwendet wird, steigen die Kosten …
– Nicolas Hamilton
11. Januar 2017 um 23:32 Uhr
Jutta
for i in range(8, 0, -1)
wird dieses Problem lösen. Es wird 8 zu 1 ausgegeben, und -1 bedeutet eine umgekehrte Liste
Ehrlich gesagt finde ich das weniger intuitiv als reversed(range(n))
– Nicolas Hamilton
11. Januar 2017 um 8:33 Uhr
@NicholasHamilton Stimme dir zu, aber die Idee hinter dieser Antwort ist, weniger Ressourcen zu verbrauchen … (und die Frage war, nur die Bereichsfunktion zu verwenden :))
– Andriy Ivaneyko
11. Januar 2017 um 9:12 Uhr
Ok, keine Sorge, ich denke, es kommt auf die Situation an. Wenn beispielsweise die Bereichsfunktion als Index für eine Schleife verwendet wird, hat sie nur begrenzte Auswirkungen. Wenn sie jedoch innerhalb einer externen Schleife verwendet wird, steigen die Kosten …
– Nicolas Hamilton
11. Januar 2017 um 23:32 Uhr
Sehr oft gestellte Frage ist, ob range(9, -1, -1)
besser als reversed(range(10))
in Python3? Leute, die in anderen Sprachen mit Iteratoren gearbeitet haben, neigen sofort zu der Annahme, dass reversed() alle Werte zwischenspeichern und dann in umgekehrter Reihenfolge zurückkehren muss. Das Ding ist das von Python reversed()
Operator funktioniert nicht, wenn das Objekt nur ein Iterator ist. Das Objekt muss eines der folgenden zwei haben, damit reversed() funktioniert:
len()
und Integer-Indizes via []
__reversed__()
Methode implementiert.Wenn Sie versuchen, reversed() für ein Objekt zu verwenden, das keines der oben genannten Elemente enthält, erhalten Sie Folgendes:
>>> [reversed((x for x in range(10)))]
TypeError: 'generator' object is not reversible
Also kurz gesagt, Pythons reversed()
ist nur für Array-ähnliche Objekte gedacht und sollte daher die gleiche Leistung wie die Vorwärtsiteration haben.
Aber was ist mit range()
? Ist das nicht ein Generator? In Python 3 ist es ein Generator, aber in eine Klasse verpackt, die beide oben genannten implementiert. So range(100000)
nimmt nicht viel Speicher in Anspruch, unterstützt aber dennoch eine effiziente Indizierung und Umkehrung.
Zusammenfassend können Sie also verwenden reversed(range(10))
ohne Leistungseinbußen.
Wie wäre es mit [*range(9, -1, -1)]? Super pythonisch!
– Onofricamila
8. Juni 2020 um 13:38 Uhr