Was ist in Python der beste Weg, um eine neue Liste zu erstellen, deren Elemente mit denen einer anderen Liste identisch sind, jedoch in umgekehrter Reihenfolge? (Ich möchte die vorhandene Liste nicht ändern.)
Hier ist eine Lösung, die mir eingefallen ist:
new_list = list(reversed(old_list))
Es ist auch möglich, das Duplikat zu duplizieren und old_list
dann umzukehren:
new_list = list(old_list) # or `new_list = old_list[:]`
new_list.reverse()
Gibt es eine bessere Option, die ich übersehen habe? Wenn nicht, gibt es einen zwingenden Grund (z. B. Effizienz), einen der oben genannten Ansätze gegenüber dem anderen zu verwenden?
quelle
list(reversed(oldlist))
. Anders als eine kleinere Mikro-Optimierung, gibt es keinen Grund bevorzugen[::-1]
zureversed()
?reversed
hat dies einen großen Vorteil, wenn Sie die Liste nicht benötigen, da sie weder Speicher noch Zeit im Voraus verschwendet. Wenn Sie die Liste jedoch benötigen, ist die Verwendung von[::-1]
anstelle vonlist(reversed())
analog zu der Verwendung von[listcomp]
anstelle vonlist(genexpr)
.[::-1]
bedeutet, das letzte Element einer Liste zu entfernen, anstatt es umzukehren.reversed(list)
gibt genau an, was es tut; es formuliert seine Absicht im Sinne von "Explizit ist besser als implizit", "Lesbarkeit zählt" und "Sparse ist besser als dicht".Jetzt lass uns
timeit
. Hinweis: Alex[::-1]
ist am schnellsten :)Update: Die von inspectorG4dget vorgeschlagene List Comp-Methode wurde hinzugefügt. Ich werde die Ergebnisse für sich selbst sprechen lassen.
quelle
[::-1]
Anpassungen
Es lohnt sich, einen Basis-Benchmark / eine Basisanpassung für die Timeit-Berechnungen von sdolan bereitzustellen, die die Leistung von "umgekehrt" ohne die oft unnötige
list()
Konvertierung zeigen. Dieselist()
Operation fügt der Laufzeit weitere 26 usecs hinzu und wird nur für den Fall benötigt, dass ein Iterator nicht akzeptabel ist.Ergebnisse:
Berechnungen:
Schlussfolgerungen:
Der Abschluss dieser Tests ist um 12,4 usecs
reversed()
schneller als der Slice[::-1]
quelle
''.join(reversed(['1','2','3']))
, ist die Slice-Methode immer noch> 30% schneller.