Was ist mit [* Bereich (9, -1, -1)]? Super pythonisch!
Onofricamila
Antworten:
561
verwenden reversed()Funktion:
reversed(range(10))
Es ist viel sinnvoller.
Aktualisieren:
Wenn Sie möchten, dass es sich um eine Liste handelt (wie btk hervorhob):
list(reversed(range(10)))
Aktualisieren:
Wenn Sie nur rangedas gleiche Ergebnis erzielen möchten , können Sie alle Parameter verwenden.range(start, stop, step)
Um beispielsweise 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 keine Schneidevorgänge ausführen.
Jakob Bowyer
6
Diese Antwort ist sehr klar und leicht zu verstehen, muss es aber range(10)nicht sein range(9). Wenn Sie eine vollständig ausgearbeitete Liste (zum Schneiden usw.) wünschen, sollten Sie dies auch tun list(reversed(range(10))).
John Y
5
Dies erzeugt einen Iterator, OP fragt nach einem Ergebnis in Form einer Liste.
BTK
6
Die Verwendung von "umgekehrt" mit dem Python-Generator (vorausgesetzt, wir sprechen von der integrierten Python 3-Reihe) ist nur konzeptionell falsch und lehrt falsche Gewohnheiten, die Speicher- / Verarbeitungskomplexität beim Programmieren in Hochsprache nicht zu berücksichtigen.
Thedk
7
In Python3 werden reversedGeneratoren im Allgemeinen nicht akzeptiert, aber akzeptiert range. Warum sollte reversed(range(10000))Speicher für die gesamte Liste reserviert werden müssen? rangeKann ein Objekt zurückgegeben werden, das die __reversed__Methode implementiert, die eine effiziente umgekehrte Iteration ermöglicht?
Avmohan
312
Verwenden Sie die integrierte Funktion 'Bereich'. Die Unterschrift ist range(start, stop, step). Dies erzeugt eine Sequenz, die Zahlen ergibt, beginnend mit startund endend, wenn stoperreicht wurde, ausgenommen stop.
In Python 3 wird dadurch ein Nicht-Listen- rangeObjekt erzeugt, das effektiv wie eine schreibgeschützte Liste funktioniert (jedoch viel weniger Speicher benötigt, insbesondere für große Bereiche).
Kannst du das bitte auch erklären, kannst du mir bitte auch eine Website / ein PDF-Buch für Python
empfehlen
8
@ramesh Wenn Sie help(range)in einer Python-Shell ausgeführt werden, werden Ihnen die Argumente mitgeteilt . Sie sind die Nummer, mit der begonnen werden soll, die Nummer, mit der geendet werden soll (exklusiv) und der Schritt, der ausgeführt werden muss. Sie beginnt also bei 9 und subtrahiert 1, bis sie -1 erreicht (an diesem Punkt stoppt sie ohne Rückkehr, weshalb Der Bereich endet um 0)
Michael Mrozek
3
@ ramesh.mimit: Gehen Sie einfach auf die offizielle Python-Site. Dort finden Sie eine vollständige Dokumentation, einschließlich eines großartigen Tutorials.
John Y
5
Das ist wirklich die richtige Antwort, aber es könnte klarer erklärt werden. range(start, stop, step) - Beginnen Sie mit der Zahl startund erzielen Sie Ergebnisse, sofern stopdiese nicht erreicht wurden step.
Herr B
43
Sie könnten das verwenden, range(10)[::-1]was dasselbe ist range(9, -1, -1)und wahrscheinlich besser lesbar ist (wenn Sie mit der gängigen sequence[::-1]Python-Sprache vertraut sind ).
Für diejenigen, die an der "Effizienz" der bisher gesammelten Optionen interessiert sind ...
Jaime RGP Antwort führte mich zu meinem Computer neu zu starten , nachdem Timing des etwas „herausfordernd“ Lösung von Jason buchstäblich nach meinem eigenen Vorschlag (via Kommentar). Um den Neugierigen die Ausfallzeiten zu ersparen, präsentiere ich hier meine Ergebnisse (Worst-First):
Keine Verwendung, reverseda die Bereichsmethode eine umgekehrte Liste zurückgeben kann.
Wenn Sie eine Iteration über n Elemente haben und die von range(start, stop, step)Ihnen zurückgegebene Reihenfolge der Liste ersetzen möchten, müssen Sie den dritten Parameter des Bereichs verwenden, der ihn identifiziert stepund auf ihn -1setzt. Andere Parameter müssen entsprechend angepasst werden:
Geben Sie Stop - Parameter wie -1(es vorherigen Wert ist stop - 1, stopwar gleich 0).
Als Startparameter verwenden n-1.
Das Äquivalent des Bereichs (n) in umgekehrter Reihenfolge wäre also:
Ehrlich gesagt finde ich das weniger intuitiv alsreversed(range(n))
Nicholas Hamilton
1
@NicholasHamilton Stimmen Sie zu, aber die Idee hinter dieser Antwort ist, weniger Ressourcen zu verwenden ... (und die Frage war über die Verwendung nur der Bereichsfunktion :))
Andriy Ivaneyko
Ok, keine Sorge, ich denke, es hängt von der Situation ab. Wenn beispielsweise die Bereichsfunktion als Index für eine Schleife verwendet wird, hat sie nur eine begrenzte Wirkung. Wenn sie jedoch innerhalb einer externen Schleife verwendet wird, erhöhen sich die Kosten ...
Nicholas Hamilton
8
Abgesehen von der Lesbarkeit reversed(range(n))scheint es schneller zu sein als range(n)[::-1].
$ python -m timeit "reversed(range(1000000000))"1000000 loops, best of 3:0.598 usec per loop
$ python -m timeit "range(1000000000)[::-1]"1000000 loops, best of 3:0.945 usec per loop
gut, ein paar Zahlen zu haben :) - warum hast du nicht auch hinzugefügt range(1000000000-1,-1,-1)?
Wolf
... besser nicht timeit range(1000000000-1,-1,-1)in der Kommandozeile versuchen , sondern meine Ergebnisse sehen :-)
Wolf
6
Die Anforderung in dieser Frage erfordert eine listganze Zahl der Größe 10 in absteigender Reihenfolge. Lassen Sie uns also eine Liste in Python erstellen.
# This meets the requirement.# But it is a bit harder to wrap one's head around this. right?>>> range(10-1,-1,-1)[9,8,7,6,5,4,3,2,1,0]# let's find something that is a bit more self-explanatory. Sounds good?# ----------------------------------------------------# This returns a list in ascending order.# Opposite of what the requirement called for.>>> range(10)[0,1,2,3,4,5,6,7,8,9]# This returns an iterator in descending order.# Doesn't meet the requirement as it is not a list.>>> reversed(range(10))<listreverseiterator object at 0x10e14e090># This returns a list in descending order and meets the requirement>>> list(reversed(range(10)))[9,8,7,6,5,4,3,2,1,0]
Ich mag das Triple-1 wirklich. Genau dieses Muster macht es einfach, es beizubehalten. wrap one's head around thisHeute habe ich gelernt, dass man es verwenden sollte , range(n-1, -1, -1)wenn man einen Bereich in umgekehrter Reihenfolge durchquert , wenn es wirklich effizient sein muss.
Wolf
5
Sie können umgekehrte Zahlen mit range () BIF Like, drucken.
for number in range (10,0,-1):print( number )
Die Ausgabe wird [10,9,8,7,6,5,4,3,2,1] sein.
range () - Bereich (Start, Ende, Inkrement / Dekrement), wobei Start inklusive, Ende exklusiv ist und Inkrement beliebige Zahlen sein kann und sich wie ein Schritt verhält
Sehr oft gestellte Frage ist, ob range(9, -1, -1)besser als reversed(range(10))in Python 3? Personen, die mit Iteratoren in anderen Sprachen gearbeitet haben, neigen sofort dazu zu denken, dass reverse () alle Werte zwischenspeichern und dann in umgekehrter Reihenfolge zurückkehren muss. Der Python- reversed()Operator funktioniert nicht, wenn das Objekt nur ein Iterator ist. Das Objekt muss eine von unter zwei haben, damit reverse () funktioniert:
Wenn Sie versuchen, reverse () für ein Objekt zu verwenden, das keines der oben genannten Elemente enthält, erhalten Sie:
>>>[reversed((x for x in range(10)))]TypeError:'generator' object isnot reversible
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, der jedoch in eine Klasse eingeschlossen ist, die beide oben genannten implementiert. Damitrange(100000) also nicht viel Speicher in Anspruch, unterstützt aber dennoch eine effiziente Indizierung und Umkehrung.
Zusammenfassend können Sie also reversed(range(10))ohne Leistungseinbußen verwenden.
Ihre Antwort zeigt, warum reversed(range(10))weniger fehleranfällig ist. Nichts für ungut Asinox. Nur eine ehrliche Beobachtung.
Michał Šrajer
Ich weiß nicht, ob es Standard ist, falsche Antworten anzuzeigen. Kann ich oder jemand es korrigieren oder sogar entfernen?
Sinuskonata
3
@sine, nein, lass es einfach und frage dich, wie es 3 positive Stimmen gesammelt hat ... Ich nehme an, du könntest es für die Aufmerksamkeit des Moderators markieren (Duplikat der Antwort von 18 Monaten zuvor, außer gebrochen), nicht sicher, ob sie es löschen würden oder nicht.
Sie müssen nicht unbedingt die Bereichsfunktion verwenden, sondern können einfach die Liste [:: - 1] erstellen, die die Liste schnell in umgekehrter Reihenfolge zurückgeben soll, ohne Ergänzungen zu verwenden.
Dies scheint die in einer früheren Antwort vorgeschlagene Lösung zu sein . Es scheint auch, dass Sie versuchen, eine andere vorherige Antwort zu kommentieren - Sie müssen ein bisschen mehr Ansehen erlangen, bevor Sie dies tun können.
Grisha Levit
1
Angenommen, Sie haben eine Liste mit dem Namen a = {1,2,3,4,5}. Wenn Sie die Liste nun in umgekehrter Reihenfolge drucken möchten, verwenden Sie einfach den folgenden Code.
a.reverse
for i in a:print(i)
Ich weiß, dass Sie mit Range gefragt haben, aber es ist bereits beantwortet.
Sie erhalten keinen 0-Fall. Angenommen, Ihre 10 ist keine magische Zahl und eine Variable, mit der Sie nachschlagen, beginnt von hinten. Wenn Ihr n-Fall 0 ist, wird umgekehrt (Bereich (0)) nicht ausgeführt, was falsch ist, wenn Sie zufällig ein einzelnes Objekt im Nullindex haben.
Ich dachte, dass viele (wie ich) mehr an einem häufigen Fall interessiert sein könnten, eine vorhandene Liste in umgekehrter Reihenfolge zu durchlaufen , wie im Titel angegeben, anstatt nur Indizes für eine solche Durchquerung zu generieren.
Auch wenn für diesen Fall immer noch die richtigen Antworten in Ordnung sind, möchte ich darauf hinweisen, dass der in Wolfs Antwort durchgeführte Leistungsvergleich nur zur Generierung von Indizes dient. Daher habe ich einen ähnlichen Benchmark für das Durchlaufen einer vorhandenen Liste in umgekehrter Reihenfolge erstellt.
%timeit [a[i]for i in range(9,-1,-1)]1.09µs ±11.1 ns per loop (mean ± std. dev. of 7 runs,1000000 loops each)
Wie Sie sehen, müssen in diesem Fall keine Indizes explizit generiert werden. Die schnellste Methode ist also die, die weniger zusätzliche Aktionen ausführt.
NB: Ich habe in JupyterLab getestet, das einen praktischen "magischen Befehl" hat %timeit. Es verwendet Standard timeit.timeitunter der Haube. Getestet für Python 3.7.3
Antworten:
verwenden
reversed()
Funktion:Es ist viel sinnvoller.
Aktualisieren:
Wenn Sie möchten, dass es sich um eine Liste handelt (wie btk hervorhob):
Aktualisieren:
Wenn Sie nur
range
das gleiche Ergebnis erzielen möchten , können Sie alle Parameter verwenden.range(start, stop, step)
Um beispielsweise eine Liste zu erstellen
[5,4,3,2,1,0]
, können Sie Folgendes verwenden: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.
quelle
range(10)
nicht seinrange(9)
. Wenn Sie eine vollständig ausgearbeitete Liste (zum Schneiden usw.) wünschen, sollten Sie dies auch tunlist(reversed(range(10)))
.reversed
Generatoren im Allgemeinen nicht akzeptiert, aber akzeptiertrange
. Warum solltereversed(range(10000))
Speicher für die gesamte Liste reserviert werden müssen?range
Kann ein Objekt zurückgegeben werden, das die__reversed__
Methode implementiert, die eine effiziente umgekehrte Iteration ermöglicht?Verwenden Sie die integrierte Funktion 'Bereich'. Die Unterschrift ist
range(start, stop, step)
. Dies erzeugt eine Sequenz, die Zahlen ergibt, beginnend mitstart
und endend, wennstop
erreicht wurde, ausgenommenstop
.In Python 3 wird dadurch ein Nicht-Listen-
range
Objekt erzeugt, das effektiv wie eine schreibgeschützte Liste funktioniert (jedoch viel weniger Speicher benötigt, insbesondere für große Bereiche).quelle
help(range)
in einer Python-Shell ausgeführt werden, werden Ihnen die Argumente mitgeteilt . Sie sind die Nummer, mit der begonnen werden soll, die Nummer, mit der geendet werden soll (exklusiv) und der Schritt, der ausgeführt werden muss. Sie beginnt also bei 9 und subtrahiert 1, bis sie -1 erreicht (an diesem Punkt stoppt sie ohne Rückkehr, weshalb Der Bereich endet um 0)range(start, stop, step)
- Beginnen Sie mit der Zahlstart
und erzielen Sie Ergebnisse, sofernstop
diese nicht erreicht wurdenstep
.Sie könnten das verwenden,
range(10)[::-1]
was dasselbe istrange(9, -1, -1)
und wahrscheinlich besser lesbar ist (wenn Sie mit der gängigensequence[::-1]
Python-Sprache vertraut sind ).quelle
Für diejenigen, die an der "Effizienz" der bisher gesammelten Optionen interessiert sind ...
Jaime RGP Antwort führte mich zu meinem Computer neu zu starten , nachdem Timing des etwas „herausfordernd“ Lösung von Jason buchstäblich nach meinem eigenen Vorschlag (via Kommentar). Um den Neugierigen die Ausfallzeiten zu ersparen, präsentiere ich hier meine Ergebnisse (Worst-First):
Jasons Antwort (vielleicht nur ein Ausflug in die Macht des Listenverständnisses ):
Martineaus Antwort (lesbar, wenn Sie mit der Syntax der erweiterten Slices vertraut sind ):
Michał Šrajers Antwort (die akzeptierte, sehr lesbar):
bene Antwort (die erste, aber sehr lückenhaft zu dieser Zeit ):
Die letzte Option ist leicht zu merken,
range(n-1,-1,-1)
wenn man die Notation von Val Neekman verwendet .quelle
wird dieses Problem lösen. Es wird 8 zu 1 ausgegeben und -1 bedeutet eine umgekehrte Liste
quelle
Keine Verwendung,
reverse
da die Bereichsmethode eine umgekehrte Liste zurückgeben kann.Wenn Sie eine Iteration über n Elemente haben und die von
range(start, stop, step)
Ihnen zurückgegebene Reihenfolge der Liste ersetzen möchten, müssen Sie den dritten Parameter des Bereichs verwenden, der ihn identifiziertstep
und auf ihn-1
setzt. Andere Parameter müssen entsprechend angepasst werden:-1
(es vorherigen Wert iststop - 1
,stop
war gleich0
).n-1
.Das Äquivalent des Bereichs (n) in umgekehrter Reihenfolge wäre also:
quelle
reversed(range(n))
Abgesehen von der Lesbarkeit
reversed(range(n))
scheint es schneller zu sein alsrange(n)[::-1]
.Nur wenn sich jemand wundert :)
quelle
range(1000000000-1,-1,-1)
?timeit range(1000000000-1,-1,-1)
in der Kommandozeile versuchen , sondern meine Ergebnisse sehen :-)Die Anforderung in dieser Frage erfordert eine
list
ganze Zahl der Größe 10 in absteigender Reihenfolge. Lassen Sie uns also eine Liste in Python erstellen.quelle
-1
wirklich. Genau dieses Muster macht es einfach, es beizubehalten.wrap one's head around this
Heute habe ich gelernt, dass man es verwenden sollte ,range(n-1, -1, -1)
wenn man einen Bereich in umgekehrter Reihenfolge durchquert , wenn es wirklich effizient sein muss.Sie können umgekehrte Zahlen mit range () BIF Like, drucken.
Die Ausgabe wird [10,9,8,7,6,5,4,3,2,1] sein.
range () - Bereich (Start, Ende, Inkrement / Dekrement), wobei Start inklusive, Ende exklusiv ist und Inkrement beliebige Zahlen sein kann und sich wie ein Schritt verhält
quelle
Sehr oft gestellte Frage ist, ob
range(9, -1, -1)
besser alsreversed(range(10))
in Python 3? Personen, die mit Iteratoren in anderen Sprachen gearbeitet haben, neigen sofort dazu zu denken, dass reverse () alle Werte zwischenspeichern und dann in umgekehrter Reihenfolge zurückkehren muss. Der Python-reversed()
Operator funktioniert nicht, wenn das Objekt nur ein Iterator ist. Das Objekt muss eine von unter zwei haben, damit reverse () funktioniert:len()
oder Integer-Indizes über[]
__reversed__()
Methode implementiert haben.Wenn Sie versuchen, reverse () für ein Objekt zu verwenden, das keines der oben genannten Elemente enthält, erhalten Sie:
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, der jedoch in eine Klasse eingeschlossen ist, die beide oben genannten implementiert. Damitrange(100000)
also nicht viel Speicher in Anspruch, unterstützt aber dennoch eine effiziente Indizierung und Umkehrung.Zusammenfassend können Sie also
reversed(range(10))
ohne Leistungseinbußen verwenden.quelle
Ich glaube, das kann helfen,
unten ist Verwendung:
quelle
quelle
reversed(range(10))
weniger fehleranfällig ist. Nichts für ungut Asinox. Nur eine ehrliche Beobachtung.Verwenden ohne [:: - 1] oder umgekehrt -
quelle
"python!"[::-1]
?quelle
Sie müssen nicht unbedingt die Bereichsfunktion verwenden, sondern können einfach die Liste [:: - 1] erstellen, die die Liste schnell in umgekehrter Reihenfolge zurückgeben soll, ohne Ergänzungen zu verwenden.
quelle
Angenommen, Sie haben eine Liste mit dem Namen a = {1,2,3,4,5}. Wenn Sie die Liste nun in umgekehrter Reihenfolge drucken möchten, verwenden Sie einfach den folgenden Code.
Ich weiß, dass Sie mit Range gefragt haben, aber es ist bereits beantwortet.
quelle
Ist die richtige Form. Wenn du benutzt
Sie erhalten keinen 0-Fall. Angenommen, Ihre 10 ist keine magische Zahl und eine Variable, mit der Sie nachschlagen, beginnt von hinten. Wenn Ihr n-Fall 0 ist, wird umgekehrt (Bereich (0)) nicht ausgeführt, was falsch ist, wenn Sie zufällig ein einzelnes Objekt im Nullindex haben.
quelle
Ich dachte, dass viele (wie ich) mehr an einem häufigen Fall interessiert sein könnten, eine vorhandene Liste in umgekehrter Reihenfolge zu durchlaufen , wie im Titel angegeben, anstatt nur Indizes für eine solche Durchquerung zu generieren.
Auch wenn für diesen Fall immer noch die richtigen Antworten in Ordnung sind, möchte ich darauf hinweisen, dass der in Wolfs Antwort durchgeführte Leistungsvergleich nur zur Generierung von Indizes dient. Daher habe ich einen ähnlichen Benchmark für das Durchlaufen einer vorhandenen Liste in umgekehrter Reihenfolge erstellt.
TL; DR
a[::-1]
ist am schnellsten.Voraussetzungen:
Jasons Antwort :
Martineaus Antwort :
Antwort von Michał Šrajer :
Antwort von bene :
Wie Sie sehen, müssen in diesem Fall keine Indizes explizit generiert werden. Die schnellste Methode ist also die, die weniger zusätzliche Aktionen ausführt.
NB: Ich habe in JupyterLab getestet, das einen praktischen "magischen Befehl" hat
%timeit
. Es verwendet Standardtimeit.timeit
unter der Haube. Getestet für Python 3.7.3quelle