Kannst du nicht einfach: array [:: - 1] verwenden?
Kdlannoy
134
@kdlannoy Laut der in der Antwort verlinkten Seite "ist umgekehrt () im Vergleich zu erweitertem Slicing wie Bereich (1,4) [:: - 1] einfacher zu lesen, läuft schneller und benötigt wesentlich weniger Speicher. "
Jim Oldfield
5
Beim Testen war dieses Schneiden ungefähr doppelt so schnell (beim Umkehren einer Liste mit 10.000 Elementen und Erstellen einer Liste daraus). Ich habe den Speicherverbrauch jedoch nicht getestet. reverseDies kann jedoch schneller sein, wenn Sie nicht für eine spätere Auflistung verwenden müssen.
Dakkaron
5
Es ist erwähnenswert, dass dies nicht dasselbe ist wie umgekehrt ([1,2,3]), nb das 'd' am Ende ... das ist eine der anderen Antworten unten, die dies an Ort und Stelle tut, während dies zurückkehrt ein Iterator.
Luciano
14
Warum verwenden reversed()anstatt zu schneiden? Lesen Sie das Zen von Python, Regel Nummer 7: Lesbarkeit zählt!
Es funktioniert für alle interaktiven Listen, nicht nur für Listen. Nachteil ist, dass es nicht vorhanden ist.
Schweizer
6
@ Tim gibt es ein Slice zurück, ändert also nicht den tatsächlichen
Listeninhalt
12
@unixbochs umgekehrt gibt einen Iterator und keine Liste in Python 3 zurück.
Schweizer
2
es sei denn natürlich natürlich richtig in das Array eingekapselt
Einar Petersen
2
Ich stimme @Swiss zu. +1 da die Frage war, muss ich die Elemente eines Arrays haben, aber vom Ende bis zum Anfang. - Gibt reversedein listreverseiteratorObjekt (Python 2.7.x) zurück, das dann durchlaufen werden muss. - Reverse Slicing gibt eine umgekehrte Liste / Tuple / Str zurück (je nachdem, was Sie schneiden). @Einar Petersen, der eine Zeichenfolge umkehrt, damit die Ausgabe korrekt ist. Versuchen Sie:co2=['ae','ad','ac','ab','aa','z','y','x','w','v','u','t','s','r','q','p','o','n','m','l','k','j','i','h','g','f','e','d','c','b','a'] >>> co2[::-1]
Aaron Newton
368
>>> L =[0,10,20,40]>>> L.reverse()>>> L
[40,20,10,0]
Detail: Die erste ändert die Liste an Ort und Stelle, die zweite gibt nur eine neue umgekehrte Liste zurück, aber die ursprüngliche Liste wird nicht geändert.
Franzlorenzon
7
Das zweite Beispiel sollte sein L=L[::-1], die Liste tatsächlich umzukehren, sonst geben Sie die Werte nur in umgekehrter Reihenfolge zurück
robertmoggach
Nehmen wir an, wenn ich l = [1,2,3,4,5,6] und n = 2 habe, muss das Ergebnis [6,5,1,2,3,4] sein. Wie können wir das tun
Atul Jain
Sie könnten dies tun:b = l[-n:] b.reverse() l = b + l[:len(l) - n]
Shoaib Shakeel
56
Dies dient zum Duplizieren der Liste:
L =[0,10,20,40]
p = L[::-1]# Here p will be having reversed list
Dies dient zum Umkehren der Liste an Ort und Stelle:
L.reverse()# Here L will be reversed in-place (no new list made)
Das Schneiden, z. B. array = array [:: - 1], ist ein ordentlicher Trick und sehr pythonisch, aber für Neulinge vielleicht etwas dunkel. Die Verwendung der reverse () -Methode ist ein guter Weg für die tägliche Codierung, da sie leicht lesbar ist.
Wenn Sie jedoch eine Liste wie in einer Interviewfrage umkehren müssen, können Sie wahrscheinlich keine integrierten Methoden wie diese verwenden. Der Interviewer wird sich eher mit der Herangehensweise an das Problem als mit der Tiefe des Python-Wissens befassen. Ein algorithmischer Ansatz ist erforderlich. Das folgende Beispiel mit einem klassischen Swap könnte eine Möglichkeit sein: -
def reverse_in_place(lst):# Declare a function
size = len(lst)# Get the length of the sequence
hiindex = size -1
its = size/2# Number of iterations requiredfor i in xrange(0, its):# i is the low index pointer
temp = lst[hiindex]# Perform a classic swap
lst[hiindex]= lst[i]
lst[i]= temp
hiindex -=1# Decrement the high index pointerprint"Done!"# Now test it!!
array =[2,5,8,9,12,19,25,27,32,60,65,1,7,24,124,654]print array # Print the original sequence
reverse_in_place(array)# Call the function passing the listprint array # Print reversed list**The result:**[2,5,8,9,12,19,25,27,32,60,65,1,7,24,124,654]Done![654,124,24,7,1,65,60,32,27,25,19,12,9,8,5,2]
Beachten Sie, dass dies bei Tupeln oder Zeichenfolgenfolgen nicht funktioniert, da Zeichenfolgen und Tupel unveränderlich sind, dh Sie können nicht in sie schreiben, um Elemente zu ändern.
Der klassische Tausch könnte über erfolgen lst[hiindex], lst[i] = lst[i], lst[hiindex], denke ich ... ;-)
Samoth
@Samoth Diese Syntax ist nicht so klar und das Verhalten ist nicht genau offensichtlich. Deutliche Schritte sind sinnvoller.
Anthony
Warum sagen Leute, dass Dinge wie Array [:: - 1] pythonisch sind? Der Python Zen lehrt uns, dass explizit besser ist als implizit und Lesbarkeit zählt. Solche Sachen sind überhaupt nicht explizit und lesbar.
k4ppa
1
@ k4ppa: array[::-1]ist perfekt lesbar und perfekt explizit, wenn Sie Python kennen . "Lesbar" bedeutet nicht, dass "jemand, der Python Slicing noch nie verwendet hat, es lesen kann"; Das [::-1]Umkehr-Slice ist eine lächerlich verbreitete Redewendung in Python (Sie werden es die ganze Zeit in vorhandenem Code finden) und es ist perfekt lesbar, wenn Sie regelmäßig Python verwenden . Sicher, first10 = [], for i in range(10): first10.append(array[i])ist klar und deutlich, aber das macht es nicht besser als first10 = array[:10].
ShadowRanger
19
Ich finde (im Gegensatz zu einigen anderen Vorschlägen), dass dies l.reverse()bei weitem der schnellste Weg ist, eine lange Liste in Python 3 und 2 umzukehren. Es würde mich interessieren, ob andere diese Timings replizieren können.
l[::-1]ist wahrscheinlich langsamer, da die Liste vor dem Umkehren kopiert wird. Das Hinzufügen des list()Aufrufs um den Iterator von reversed(l)muss zusätzlichen Aufwand verursachen. Wenn Sie eine Kopie der Liste oder einen Iterator wünschen, verwenden Sie natürlich die entsprechenden Methoden. Wenn Sie die Liste jedoch nur umkehren möchten, l.reverse()scheint dies der schnellste Weg zu sein.
Funktionen
def rev_list1(l):return l[::-1]def rev_list2(l):return list(reversed(l))def rev_list3(l):
l.reverse()return l
list.reverseist das schnellste, weil es an Ort und Stelle umkehrt
warvariuc
Sie haben Recht, list.reverse()ist am schnellsten, aber Sie bestrafen reversed(was am besten verwendet wird, wenn Sie kein neues wollen list, nur um ein vorhandenes listin umgekehrter Reihenfolge zu iterieren , ohne das Original zu mutieren) und das Slice (das auch das Mutieren des Originals vermeidet listund ist normalerweise schneller als reversedwenn die Eingabe klein ist). Ja, wenn Sie die Kopie nicht benötigen, ist alles, was kopiert wird, teurer, aber in vielen Fällen möchten Sie den ursprünglichen Wert nicht ändern.
ShadowRanger
Es sieht so aus, als würde es reversedimmer noch verlierenlist.reverse() , aber da es die Eingabe nicht mutiert list, ist es in vielen Fällen besser. Der Verlust für reversedist gering (~ 1/6 länger als list.reverse()).
Ich habe gesucht, wie das geht, ohne die Umkehrfunktion zu verwenden. Vielen Dank.
Bernard 'Beta Berlin' Parah
Oder um an Ort und Stelle umzukehren, verwenden Sie list = list.reverse ()
SimonM
6
Zusammenfassung der Methoden mit Erläuterungs- und Timing-Ergebnissen
Es gibt mehrere gute Antworten, die jedoch verteilt sind und die meisten zeigen nicht die grundlegenden Unterschiede der einzelnen Ansätze auf.
Insgesamt ist es besser, integrierte Funktionen / Methoden zum Umkehren zu verwenden, wie bei nahezu jeder Funktion. In diesem Fall sind sie auf kurzen Listen (10 Elemente) ungefähr zwei- bis achtmal schneller und auf langen Listen bis zu 300-mal schneller als auf manuell erstellten Indizierungsmitteln. Dies ist sinnvoll, da sie von Experten erstellt, geprüft und optimiert werden. Sie sind auch weniger anfällig für Defekte und eher für Kanten- und Eckfälle geeignet.
Überlegen Sie auch, ob Sie:
Kehren Sie eine vorhandene Liste an Ort und Stelle um
Beste Lösung ist object.reverse()Methode
Erstellen Sie einen Iterator auf der Rückseite der Liste (da Sie ihn einer for-Schleife, einem Generator usw. zuführen werden).
Die beste Lösung ist reversed(object), den Iterator zu erstellen
oder erstellen Sie eine vollständige Kopie in umgekehrter Reihenfolge
Die beste Lösung ist die Verwendung von Scheiben mit einer Schrittgröße von -1: object[::-1]
Testskript
Hier ist der Beginn meines Testskripts für die behandelten Methoden. Fügen Sie alle Codefragmente in dieser Antwort zusammen, um ein Skript zu erstellen, das alle verschiedenen Möglichkeiten zum Umkehren einer Liste und der Uhrzeit ausführt (Ausgabe im letzten Abschnitt).
from timeit import timeit
from copy import copy
def time_str_ms(t):return'{0:8.2f} ms'.format(t *1000)
Methode 1: Mit obj.reverse () umkehren
Wenn das Ziel nur darin besteht, die Reihenfolge der Elemente in einer vorhandenen Liste umzukehren, ohne sie zu durchlaufen oder eine Kopie zum Arbeiten zu erhalten, verwenden Sie die <list>.reverse()Funktion. Führen Sie dies direkt auf einem Listenobjekt aus, und die Reihenfolge aller Elemente wird umgekehrt:
Beachten Sie, dass im Folgenden die angegebene ursprüngliche Variable umgekehrt wird, obwohl auch die umgekehrte Liste zurückgegeben wird. dh Sie können mit dieser Funktionsausgabe eine Kopie erstellen. Normalerweise würden Sie dafür keine Funktion erstellen, aber ich habe dies getan, um den Timing-Code am Ende zu verwenden.
Wir werden die Leistung dieser beiden Methoden testen - zuerst eine Liste an Ort und Stelle umkehren (die ursprüngliche Liste ändern), dann die Liste kopieren und anschließend umkehren.
def rev_in_place(mylist):
mylist.reverse()return mylist
def rev_copy_reverse(mylist):
a = copy(mylist)
a.reverse()return a
Methode 2: Kehren Sie eine Liste mit Slices um obj[::-1]
Mit der integrierten Index-Slicing-Methode können Sie eine Kopie eines Teils eines indizierten Objekts erstellen.
Das ursprüngliche Objekt ist davon nicht betroffen
Es wird eine vollständige Liste erstellt, kein Iterator
Die generische Syntax lautet : <object>[first_index:last_index:step]. Verwenden Sie Folgendes, um das Slicing zum Erstellen einer einfachen umgekehrten Liste zu nutzen <list>[::-1]. Wenn Sie eine Option leer lassen, werden sie auf die Standardeinstellungen des ersten und letzten Elements des Objekts gesetzt (umgekehrt, wenn die Schrittgröße negativ ist).
Durch die Indizierung können negative Zahlen verwendet werden, die ab dem Ende des Objektindex rückwärts zählen (dh -2 ist das vorletzte Element). Wenn die Schrittgröße negativ ist, beginnt sie mit dem letzten Element und indiziert um diesen Betrag rückwärts. Damit ist eine Start-End-Logik verbunden, die optimiert wurde.
def rev_slice(mylist):
a = mylist[::-1]return a
Methode 3: Kehren Sie eine Liste mit der reversed(obj)Iteratorfunktion um
Es gibt eine reversed(indexed_object)Funktion:
Dadurch wird ein Reverse-Index-Iterator erstellt, keine Liste. Großartig, wenn Sie es einer Schleife zuführen, um eine bessere Leistung bei großen Listen zu erzielen
Dies erstellt eine Kopie und wirkt sich nicht auf das Originalobjekt aus
Testen Sie mit einem rohen Iterator und erstellen Sie eine Liste aus dem Iterator.
def reversed_iterator(mylist):
a = reversed(mylist)return a
def reversed_with_list(mylist):
a = list(reversed(mylist))return a
Methode 4: Liste mit benutzerdefinierter / manueller Indizierung umkehren
Wie das Timing zeigen wird, ist es eine schlechte Idee, eigene Indizierungsmethoden zu erstellen. Verwenden Sie die integrierten Methoden, es sei denn, Sie müssen etwas wirklich Benutzerdefiniertes tun.
Das heißt, es gibt keine große Strafe bei kleineren Listengrößen, aber wenn Sie skalieren, wird die Strafe enorm. Ich bin sicher, dass mein Code unten optimiert werden könnte, aber ich werde mich an die integrierten Methoden halten.
def rev_manual_pos_gen(mylist):
max_index = len(mylist)-1return[ mylist[max_index - index]for index in range(len(mylist))]def rev_manual_neg_gen(mylist):## index is 0 to 9, but we need -1 to -10return[ mylist[-index-1]for index in range(len(mylist))]def rev_manual_index_loop(mylist):
a =[]
reverse_index = len(mylist)-1for index in range(len(mylist)):
a.append(mylist[reverse_index - index])return a
def rev_manual_loop(mylist):
a =[]
reverse_index = len(mylist)for index, _ in enumerate(mylist):
reverse_index -=1
a.append(mylist[reverse_index])return a
Timing jeder Methode
Im Folgenden finden Sie den Rest des Skripts, um die Zeit für jede Umkehrmethode festzulegen. Es zeigt, dass das Umkehren an Ort obj.reverse()und Stelle mit und das Erstellen des reversed(obj)Iterators immer am schnellsten sind, während die Verwendung von Slices der schnellste Weg ist, um eine Kopie zu erstellen.
Es erweist sich auch als nicht zu versuchen, einen Weg zu finden, dies selbst zu tun, es sei denn, Sie müssen!
loops_to_test =100000
number_of_items =10
list_to_reverse = list(range(number_of_items))if number_of_items <15:print("a: {}".format(list_to_reverse))print('Loops: {:,}'.format(loops_to_test))# List of the functions we want to test with the timer, in print order
fcns =[rev_in_place, reversed_iterator, rev_slice, rev_copy_reverse,
reversed_with_list, rev_manual_pos_gen, rev_manual_neg_gen,
rev_manual_index_loop, rev_manual_loop]
max_name_string = max([ len(fcn.__name__)for fcn in fcns ])for fcn in fcns:
a = copy(list_to_reverse)# copy to start fresh each loop
out_str =' | out = {}'.format(fcn(a))if number_of_items <15else''# Time in ms for the given # of loops on this fcn
time_str = time_str_ms(timeit(lambda: fcn(a), number=loops_to_test))# Get the output string for this function
fcn_str ='{}(a):'.format(fcn.__name__)# Add the correct string length to accommodate the maximum fcn name
format_str ='{{fx:{}s}} {{time}}{{rev}}'.format(max_name_string +4)print(format_str.format(fx=fcn_str, time=time_str, rev=out_str))
Timing-Ergebnisse
Die Ergebnisse zeigen, dass die Skalierung am besten mit den integrierten Methoden funktioniert, die für eine bestimmte Aufgabe am besten geeignet sind. Mit anderen Worten, wenn die Anzahl der Objektelemente zunimmt, beginnen die integrierten Methoden, weit überlegene Leistungsergebnisse zu erzielen.
Sie sind auch besser dran, wenn Sie die beste integrierte Methode verwenden, mit der Sie direkt das erreichen, was Sie benötigen, als Dinge aneinander zu reihen. Das heißt, das Schneiden ist am besten, wenn Sie eine Kopie der umgekehrten Liste benötigen - es ist schneller als das Erstellen einer Liste aus der reversed()Funktion und schneller als das Erstellen einer Kopie der Liste und das anschließende Ausführen obj.reverse(). Aber wenn eine dieser Methoden wirklich alles ist, was Sie brauchen, sind sie schneller, aber niemals mehr als doppelt so schnell. In der Zwischenzeit können benutzerdefinierte manuelle Methoden um Größenordnungen länger dauern, insbesondere bei sehr großen Listen.
Für die Skalierung mit einer Liste mit 1000 Elementen reversed(<list>)dauert der Funktionsaufruf ~ 30 ms, um den Iterator einzurichten. Das Umkehren an Ort und Stelle dauert nur ~ 55 ms. Bei Verwendung der Slice-Methode dauert es ~ 210 ms, um eine Kopie der vollständigen umgekehrten Liste zu erstellen Die schnellste manuelle Methode, die ich gemacht habe, dauerte ~ 8400 ms !!
Mit 2 Elementen in der Liste:
a:[0,1]Loops:100,000
rev_in_place(a):24.70 ms | out =[1,0]
reversed_iterator(a):30.48 ms | out =<list_reverseiterator object at 0x0000020242580408>
rev_slice(a):31.65 ms | out =[1,0]
rev_copy_reverse(a):63.42 ms | out =[1,0]
reversed_with_list(a):48.65 ms | out =[1,0]
rev_manual_pos_gen(a):98.94 ms | out =[1,0]
rev_manual_neg_gen(a):88.11 ms | out =[1,0]
rev_manual_index_loop(a):87.23 ms | out =[1,0]
rev_manual_loop(a):79.24 ms | out =[1,0]
Mit 10 Elementen in der Liste:
rev_in_place(a):23.39 ms | out =[9,8,7,6,5,4,3,2,1,0]
reversed_iterator(a):30.23 ms | out =<list_reverseiterator object at 0x00000290A3CB0388>
rev_slice(a):36.01 ms | out =[9,8,7,6,5,4,3,2,1,0]
rev_copy_reverse(a):64.67 ms | out =[9,8,7,6,5,4,3,2,1,0]
reversed_with_list(a):50.77 ms | out =[9,8,7,6,5,4,3,2,1,0]
rev_manual_pos_gen(a):162.83 ms | out =[9,8,7,6,5,4,3,2,1,0]
rev_manual_neg_gen(a):167.43 ms | out =[9,8,7,6,5,4,3,2,1,0]
rev_manual_index_loop(a):152.04 ms | out =[9,8,7,6,5,4,3,2,1,0]
rev_manual_loop(a):183.01 ms | out =[9,8,7,6,5,4,3,2,1,0]
Und mit 1000 Artikeln in der Liste:
rev_in_place(a):56.37 ms
reversed_iterator(a):30.47 ms
rev_slice(a):211.42 ms
rev_copy_reverse(a):295.74 ms
reversed_with_list(a):418.45 ms
rev_manual_pos_gen(a):8410.01 ms
rev_manual_neg_gen(a):11054.84 ms
rev_manual_index_loop(a):10543.11 ms
rev_manual_loop(a):15472.66 ms
Wenn Sie die Elemente der umgekehrten Liste in einer anderen Variablen speichern möchten, können Sie revArray = array[::-1]oder verwenden revArray = list(reversed(array)).
Die erste Variante ist aber etwas schneller:
z = range(1000000)
startTimeTic = time.time()
y = z[::-1]print("Time: %s s"%(time.time()- startTimeTic))
f = range(1000000)
startTimeTic = time.time()
g = list(reversed(f))print("Time: %s s"%(time.time()- startTimeTic))
Nächstes Mal möchten Sie möglicherweise verwenden timeit.
Grooveplex
5
ORGANISIEREN VON WERTEN:
In Python kann auch die Reihenfolge der Listen durch Sortieren geändert werden, wobei Ihre Variablen in numerischer / alphabetischer Reihenfolge angeordnet werden:
Vorübergehend:
print(sorted(my_list))
Dauerhaft:
my_list.sort(),print(my_list)
Sie können mit dem Flag "reverse = True" sortieren :
print(sorted(my_list, reverse=True))
oder
my_list.sort(reverse=True), print(my_list)
OHNE ORGANISIEREN
Vielleicht möchten Sie keine Werte sortieren, sondern nur die Werte umkehren. Dann können wir es so machen:
print(list(reversed(my_list)))
** Zahlen haben in der Reihenfolge der Auflistung Vorrang vor dem Alphabet. Die Organisation der Python-Werte ist fantastisch.
Verwenden Sie eine Logik der alten Schule, um Interviews zu üben.
Nummern von vorne nach hinten tauschen. Verwenden von zwei Zeigernindex[0] and index[last]
def reverse(array):
n = array
first =0
last = len(array)-1while first < last:
holder = n[first]
n[first]= n[last]
n[last]= holder
first +=1
last -=1return n
input ->[-1,1,2,3,4,5,6]
output ->[6,1,2,3,4,5,-1]
Wenn wir die Liste in zwei Teile teilen und den ersten gegen den letzten Index austauschen, ist die zeitliche Komplexität effizienter als die aufgelistete Stichprobe.
Israel Manzo
3
Sie können auch das bitweise Komplement des Array-Index verwenden, um das Array in umgekehrter Reihenfolge zu durchlaufen:
>>> array =[0,10,20,40]>>>[array[~i]for i, _ in enumerate(array)][40,20,10,0]
Genau genommen lautet die Frage nicht, wie eine Liste umgekehrt zurückgegeben werden soll, sondern wie eine Liste mit einem Beispiellistennamen umgekehrt werden soll array.
Um eine Liste mit dem Namen "array"use umzukehren array.reverse().
Die beschriebene unglaublich nützliche Slice-Methode kann auch verwendet werden, um eine Liste an Ort und Stelle umzukehren, indem die Liste als eine in Scheiben geschnittene Modifikation von sich selbst definiert wird array = array[::-1].
Mit minimaler Anzahl integrierter Funktionen, vorausgesetzt, es handelt sich um Intervieweinstellungen
array =[1,2,3,4,5,6,7,8]
inverse =[]#create container for inverse array
length = len(array)#to iterate later, returns 8
counter = length -1#because the 8th element is on position 7 (as python starts from 0)for i in range(length):
inverse.append(array[counter])
counter -=1print(inverse)
Sie können die Liste jederzeit wie einen Stapel behandeln, indem Sie die Elemente vom hinteren Ende der Liste oben auf den Stapel legen. Auf diese Weise nutzen Sie die First-In-Last-Out-Eigenschaften eines Stapels. Natürlich verbrauchen Sie das 1. Array. Ich mag diese Methode, weil sie ziemlich intuitiv ist, da Sie sehen, dass eine Liste vom Back-End verwendet wird, während die andere vom Front-End erstellt wird.
>>> l =[1,2,3,4,5,6]; nl=[]>>>while l:
nl.append(l.pop())>>>print nl
[6,5,4,3,2,1]
Hier ist eine Möglichkeit, das Gegenteil mithilfe eines Generators träge zu bewerten :
def reverse(seq):for x in range(len(seq),-1,-1):#Iterate through a sequence starting from -1 and increasing by -1.yield seq[x]#Yield a value to the generator
Es gibt 3 Methoden, um die umgekehrte Liste zu erhalten:
Schneidemethode 1: reversed_array = array[-1::-1]
Schneidemethode 2:
reversed_array2 = array[::-1]
Verwenden der integrierten Funktion: reversed_array = array.reverse()
Die dritte Funktion kehrte das vorhandene Listenobjekt tatsächlich um. Das bedeutet, dass keine Kopie der ursprünglichen Daten beibehalten wird. Dies ist ein guter Ansatz, wenn Sie die alte Version nicht beibehalten möchten. Aber scheint keine Lösung zu sein, wenn Sie die makellose und umgekehrte Version wollen.
Diese Lösung ist etwa 4,5k langsamer als l[::-1]und gleichzeitig viel weniger lesbar. Die funktionale Programmierung in Python ist leider eher langsam.
reverse
Dies kann jedoch schneller sein, wenn Sie nicht für eine spätere Auflistung verwenden müssen.reversed()
anstatt zu schneiden? Lesen Sie das Zen von Python, Regel Nummer 7: Lesbarkeit zählt!Die erweiterte Slice-Syntax wird im Python Was ist neuer Eintrag für die Veröffentlichung?
2.3.5
Auf besonderen Wunsch in einem Kommentar ist dies die aktuellste Slice-Dokumentation .
quelle
reversed
einlistreverseiterator
Objekt (Python 2.7.x) zurück, das dann durchlaufen werden muss. - Reverse Slicing gibt eine umgekehrte Liste / Tuple / Str zurück (je nachdem, was Sie schneiden). @Einar Petersen, der eine Zeichenfolge umkehrt, damit die Ausgabe korrekt ist. Versuchen Sie:co2=['ae','ad','ac','ab','aa','z','y','x','w','v','u','t','s','r','q','p','o','n','m','l','k','j','i','h','g','f','e','d','c','b','a'] >>> co2[::-1]
Oder
quelle
L=L[::-1]
, die Liste tatsächlich umzukehren, sonst geben Sie die Werte nur in umgekehrter Reihenfolge zurückb = l[-n:] b.reverse() l = b + l[:len(l) - n]
Dies dient zum Duplizieren der Liste:
Dies dient zum Umkehren der Liste an Ort und Stelle:
quelle
Ich denke, dass der beste Weg, eine Liste in Python umzukehren, darin besteht, Folgendes zu tun:
Die Arbeit ist erledigt, und jetzt haben Sie eine umgekehrte Liste.
quelle
Verwenden Sie zum Umkehren derselben Liste:
Um eine umgekehrte Liste einer anderen Liste zuzuweisen, verwenden Sie:
quelle
Das Schneiden, z. B. array = array [:: - 1], ist ein ordentlicher Trick und sehr pythonisch, aber für Neulinge vielleicht etwas dunkel. Die Verwendung der reverse () -Methode ist ein guter Weg für die tägliche Codierung, da sie leicht lesbar ist.
Wenn Sie jedoch eine Liste wie in einer Interviewfrage umkehren müssen, können Sie wahrscheinlich keine integrierten Methoden wie diese verwenden. Der Interviewer wird sich eher mit der Herangehensweise an das Problem als mit der Tiefe des Python-Wissens befassen. Ein algorithmischer Ansatz ist erforderlich. Das folgende Beispiel mit einem klassischen Swap könnte eine Möglichkeit sein: -
Beachten Sie, dass dies bei Tupeln oder Zeichenfolgenfolgen nicht funktioniert, da Zeichenfolgen und Tupel unveränderlich sind, dh Sie können nicht in sie schreiben, um Elemente zu ändern.
quelle
lst[hiindex], lst[i] = lst[i], lst[hiindex]
, denke ich ... ;-)array[::-1]
ist perfekt lesbar und perfekt explizit, wenn Sie Python kennen . "Lesbar" bedeutet nicht, dass "jemand, der Python Slicing noch nie verwendet hat, es lesen kann"; Das[::-1]
Umkehr-Slice ist eine lächerlich verbreitete Redewendung in Python (Sie werden es die ganze Zeit in vorhandenem Code finden) und es ist perfekt lesbar, wenn Sie regelmäßig Python verwenden . Sicher,first10 = []
,for i in range(10): first10.append(array[i])
ist klar und deutlich, aber das macht es nicht besser alsfirst10 = array[:10]
.Ich finde (im Gegensatz zu einigen anderen Vorschlägen), dass dies
l.reverse()
bei weitem der schnellste Weg ist, eine lange Liste in Python 3 und 2 umzukehren. Es würde mich interessieren, ob andere diese Timings replizieren können.l[::-1]
ist wahrscheinlich langsamer, da die Liste vor dem Umkehren kopiert wird. Das Hinzufügen deslist()
Aufrufs um den Iterator vonreversed(l)
muss zusätzlichen Aufwand verursachen. Wenn Sie eine Kopie der Liste oder einen Iterator wünschen, verwenden Sie natürlich die entsprechenden Methoden. Wenn Sie die Liste jedoch nur umkehren möchten,l.reverse()
scheint dies der schnellste Weg zu sein.Funktionen
Liste
Python 3.5-Timings
Python 2.7 Timings
quelle
list.reverse
ist das schnellste, weil es an Ort und Stelle umkehrtlist.reverse()
ist am schnellsten, aber Sie bestrafenreversed
(was am besten verwendet wird, wenn Sie kein neues wollenlist
, nur um ein vorhandeneslist
in umgekehrter Reihenfolge zu iterieren , ohne das Original zu mutieren) und das Slice (das auch das Mutieren des Originals vermeidetlist
und ist normalerweise schneller alsreversed
wenn die Eingabe klein ist). Ja, wenn Sie die Kopie nicht benötigen, ist alles, was kopiert wird, teurer, aber in vielen Fällen möchten Sie den ursprünglichen Wert nicht ändern.reversed
immer noch verlierenlist.reverse()
, aber da es die Eingabe nicht mutiertlist
, ist es in vielen Fällen besser. Der Verlust fürreversed
ist gering (~ 1/6 länger alslist.reverse()
).quelle
Mit
reversed
undlist
:quelle
quelle
Die Verwendung von umgekehrt (Array) wäre die wahrscheinlich beste Route.
Sollten Sie verstehen müssen, wie dies implementiert werden kann, ohne das eingebaute zu verwenden
reversed
.Dies sollte O (N) Zeit dauern.
quelle
Zusammenfassung der Methoden mit Erläuterungs- und Timing-Ergebnissen
Es gibt mehrere gute Antworten, die jedoch verteilt sind und die meisten zeigen nicht die grundlegenden Unterschiede der einzelnen Ansätze auf.
Insgesamt ist es besser, integrierte Funktionen / Methoden zum Umkehren zu verwenden, wie bei nahezu jeder Funktion. In diesem Fall sind sie auf kurzen Listen (10 Elemente) ungefähr zwei- bis achtmal schneller und auf langen Listen bis zu 300-mal schneller als auf manuell erstellten Indizierungsmitteln. Dies ist sinnvoll, da sie von Experten erstellt, geprüft und optimiert werden. Sie sind auch weniger anfällig für Defekte und eher für Kanten- und Eckfälle geeignet.
Überlegen Sie auch, ob Sie:
object.reverse()
Methodereversed(object)
, den Iterator zu erstellenobject[::-1]
Testskript
Hier ist der Beginn meines Testskripts für die behandelten Methoden. Fügen Sie alle Codefragmente in dieser Antwort zusammen, um ein Skript zu erstellen, das alle verschiedenen Möglichkeiten zum Umkehren einer Liste und der Uhrzeit ausführt (Ausgabe im letzten Abschnitt).
Methode 1: Mit obj.reverse () umkehren
Wenn das Ziel nur darin besteht, die Reihenfolge der Elemente in einer vorhandenen Liste umzukehren, ohne sie zu durchlaufen oder eine Kopie zum Arbeiten zu erhalten, verwenden Sie die
<list>.reverse()
Funktion. Führen Sie dies direkt auf einem Listenobjekt aus, und die Reihenfolge aller Elemente wird umgekehrt:Beachten Sie, dass im Folgenden die angegebene ursprüngliche Variable umgekehrt wird, obwohl auch die umgekehrte Liste zurückgegeben wird. dh Sie können mit dieser Funktionsausgabe eine Kopie erstellen. Normalerweise würden Sie dafür keine Funktion erstellen, aber ich habe dies getan, um den Timing-Code am Ende zu verwenden.
Wir werden die Leistung dieser beiden Methoden testen - zuerst eine Liste an Ort und Stelle umkehren (die ursprüngliche Liste ändern), dann die Liste kopieren und anschließend umkehren.
Methode 2: Kehren Sie eine Liste mit Slices um
obj[::-1]
Mit der integrierten Index-Slicing-Methode können Sie eine Kopie eines Teils eines indizierten Objekts erstellen.
Die generische Syntax lautet :
<object>[first_index:last_index:step]
. Verwenden Sie Folgendes, um das Slicing zum Erstellen einer einfachen umgekehrten Liste zu nutzen<list>[::-1]
. Wenn Sie eine Option leer lassen, werden sie auf die Standardeinstellungen des ersten und letzten Elements des Objekts gesetzt (umgekehrt, wenn die Schrittgröße negativ ist).Durch die Indizierung können negative Zahlen verwendet werden, die ab dem Ende des Objektindex rückwärts zählen (dh -2 ist das vorletzte Element). Wenn die Schrittgröße negativ ist, beginnt sie mit dem letzten Element und indiziert um diesen Betrag rückwärts. Damit ist eine Start-End-Logik verbunden, die optimiert wurde.
Methode 3: Kehren Sie eine Liste mit der
reversed(obj)
Iteratorfunktion umEs gibt eine
reversed(indexed_object)
Funktion:Testen Sie mit einem rohen Iterator und erstellen Sie eine Liste aus dem Iterator.
Methode 4: Liste mit benutzerdefinierter / manueller Indizierung umkehren
Wie das Timing zeigen wird, ist es eine schlechte Idee, eigene Indizierungsmethoden zu erstellen. Verwenden Sie die integrierten Methoden, es sei denn, Sie müssen etwas wirklich Benutzerdefiniertes tun.
Das heißt, es gibt keine große Strafe bei kleineren Listengrößen, aber wenn Sie skalieren, wird die Strafe enorm. Ich bin sicher, dass mein Code unten optimiert werden könnte, aber ich werde mich an die integrierten Methoden halten.
Timing jeder Methode
Im Folgenden finden Sie den Rest des Skripts, um die Zeit für jede Umkehrmethode festzulegen. Es zeigt, dass das Umkehren an Ort
obj.reverse()
und Stelle mit und das Erstellen desreversed(obj)
Iterators immer am schnellsten sind, während die Verwendung von Slices der schnellste Weg ist, um eine Kopie zu erstellen.Es erweist sich auch als nicht zu versuchen, einen Weg zu finden, dies selbst zu tun, es sei denn, Sie müssen!
Timing-Ergebnisse
Die Ergebnisse zeigen, dass die Skalierung am besten mit den integrierten Methoden funktioniert, die für eine bestimmte Aufgabe am besten geeignet sind. Mit anderen Worten, wenn die Anzahl der Objektelemente zunimmt, beginnen die integrierten Methoden, weit überlegene Leistungsergebnisse zu erzielen.
Sie sind auch besser dran, wenn Sie die beste integrierte Methode verwenden, mit der Sie direkt das erreichen, was Sie benötigen, als Dinge aneinander zu reihen. Das heißt, das Schneiden ist am besten, wenn Sie eine Kopie der umgekehrten Liste benötigen - es ist schneller als das Erstellen einer Liste aus der
reversed()
Funktion und schneller als das Erstellen einer Kopie der Liste und das anschließende Ausführenobj.reverse()
. Aber wenn eine dieser Methoden wirklich alles ist, was Sie brauchen, sind sie schneller, aber niemals mehr als doppelt so schnell. In der Zwischenzeit können benutzerdefinierte manuelle Methoden um Größenordnungen länger dauern, insbesondere bei sehr großen Listen.Für die Skalierung mit einer Liste mit 1000 Elementen
reversed(<list>)
dauert der Funktionsaufruf ~ 30 ms, um den Iterator einzurichten. Das Umkehren an Ort und Stelle dauert nur ~ 55 ms. Bei Verwendung der Slice-Methode dauert es ~ 210 ms, um eine Kopie der vollständigen umgekehrten Liste zu erstellen Die schnellste manuelle Methode, die ich gemacht habe, dauerte ~ 8400 ms !!Mit 2 Elementen in der Liste:
Mit 10 Elementen in der Liste:
Und mit 1000 Artikeln in der Liste:
quelle
Wenn Sie die Elemente der umgekehrten Liste in einer anderen Variablen speichern möchten, können Sie
revArray = array[::-1]
oder verwendenrevArray = list(reversed(array))
.Die erste Variante ist aber etwas schneller:
Ausgabe:
quelle
timeit
.ORGANISIEREN VON WERTEN:
In Python kann auch die Reihenfolge der Listen durch Sortieren geändert werden, wobei Ihre Variablen in numerischer / alphabetischer Reihenfolge angeordnet werden:
Vorübergehend:
Dauerhaft:
Sie können mit dem Flag "reverse = True" sortieren :
OHNE ORGANISIEREN
Vielleicht möchten Sie keine Werte sortieren, sondern nur die Werte umkehren. Dann können wir es so machen:
** Zahlen haben in der Reihenfolge der Auflistung Vorrang vor dem Alphabet. Die Organisation der Python-Werte ist fantastisch.
quelle
Mit etwas Logik
Verwenden Sie eine Logik der alten Schule, um Interviews zu üben.
quelle
Sie können auch das bitweise Komplement des Array-Index verwenden, um das Array in umgekehrter Reihenfolge zu durchlaufen:
Was auch immer Sie tun, tun Sie es nicht so.
quelle
Listenverständnis verwenden:
quelle
Eine andere Lösung wäre, hierfür numpy.flip zu verwenden
quelle
Genau genommen lautet die Frage nicht, wie eine Liste umgekehrt zurückgegeben werden soll, sondern wie eine Liste mit einem Beispiellistennamen umgekehrt werden soll
array
.Um eine Liste mit dem Namen
"array"
use umzukehrenarray.reverse()
.Die beschriebene unglaublich nützliche Slice-Methode kann auch verwendet werden, um eine Liste an Ort und Stelle umzukehren, indem die Liste als eine in Scheiben geschnittene Modifikation von sich selbst definiert wird
array = array[::-1]
.quelle
array[:] = array[::-1]
quelle
Mit minimaler Anzahl integrierter Funktionen, vorausgesetzt, es handelt sich um Intervieweinstellungen
quelle
Die direkteste Übersetzung Ihrer Anforderung in Python ist diese
for
Aussage:Dies ist ziemlich kryptisch, kann aber nützlich sein.
quelle
quelle
//
Floor Division Operator.Sie können die Liste jederzeit wie einen Stapel behandeln, indem Sie die Elemente vom hinteren Ende der Liste oben auf den Stapel legen. Auf diese Weise nutzen Sie die First-In-Last-Out-Eigenschaften eines Stapels. Natürlich verbrauchen Sie das 1. Array. Ich mag diese Methode, weil sie ziemlich intuitiv ist, da Sie sehen, dass eine Liste vom Back-End verwendet wird, während die andere vom Front-End erstellt wird.
quelle
quelle
verwenden
quelle
Hier ist eine Möglichkeit, das Gegenteil mithilfe eines Generators träge zu bewerten :
Jetzt iterieren Sie wie folgt durch:
Wenn Sie eine Liste benötigen:
quelle
Es gibt 3 Methoden, um die umgekehrte Liste zu erhalten:
Schneidemethode 1:
reversed_array = array[-1::-1]
Schneidemethode 2:
reversed_array2 = array[::-1]
Verwenden der integrierten Funktion:
reversed_array = array.reverse()
Die dritte Funktion kehrte das vorhandene Listenobjekt tatsächlich um. Das bedeutet, dass keine Kopie der ursprünglichen Daten beibehalten wird. Dies ist ein guter Ansatz, wenn Sie die alte Version nicht beibehalten möchten. Aber scheint keine Lösung zu sein, wenn Sie die makellose und umgekehrte Version wollen.
quelle
quelle
l[::-1]
und gleichzeitig viel weniger lesbar. Die funktionale Programmierung in Python ist leider eher langsam.