Eine Liste in umgekehrter Reihenfolge mit range() drucken?

Lesezeit: 6 Minuten

Benutzer-Avatar
ramesh.mimit

Wie kann man folgende Liste mit erzeugen range() in Python?

[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

  • Wie wäre es mit [*range(9, -1, -1)]? Super pythonisch!

    – Onofricamila

    8. Juni 2020 um 13:38 Uhr

Benutzer-Avatar
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 startund 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 startund 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

Benutzer-Avatar
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).

Benutzer-Avatar
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.

Benutzer-Avatar
Andrij Iwanejko

Kein Sinn zu benutzen 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 -1andere Parameter sind entsprechend anzupassen:

  1. Zur Verfügung stellen stop Parameter als -1 (es ist der vorherige Wert von stop - 1, stop gleich war 0).
  2. Als Startparameter verwenden 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

Benutzer-Avatar
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:

  1. Entweder unterstützen len() und Integer-Indizes via []
  2. Oder haben __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.

1113400cookie-checkEine Liste in umgekehrter Reihenfolge mit range() drucken?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy