list.sort()
sortiert die Liste und ersetzt die ursprüngliche Liste, während sorted(list)
eine sortierte Kopie der Liste zurückgegeben wird, ohne die ursprüngliche Liste zu ändern.
- Wann wird einer dem anderen vorgezogen?
- Welches ist effizienter? Um wie viel?
- Kann eine Liste nach der Ausführung in den unsortierten Zustand zurückgesetzt werden
list.sort()
?
sorted()
ein Zeichenfolgenargument aufrufen, aber denken, dass es eine Liste ist, erhalten Sie ein Listenergebnis, keine Zeichenfolge :sorted("abcd", reverse=True)
gibt['d', 'c', 'b', 'a']
nicht"dcba"
Antworten:
sorted()
Gibt eine neue sortierte Liste zurück, wobei die ursprüngliche Liste nicht betroffen ist.list.sort()
sortiert die Liste in-Place , die Listenindizes mutiert und kehrtNone
(wie alle in-Place - Operationen).sorted()
funktioniert auf jeder iterierbaren, nicht nur auf Listen. Zeichenfolgen, Tupel, Wörterbücher (Sie erhalten die Schlüssel), Generatoren usw. geben eine Liste mit allen Elementen zurück, sortiert.Verwenden
list.sort()
Sie diese Option,sorted()
wenn Sie die Liste mutieren möchten, wenn Sie ein neues sortiertes Objekt zurückhaben möchten. Verwendensorted()
Sie diese Option, wenn Sie etwas sortieren möchten, das iterierbar und noch keine Liste ist .Für Listen
list.sort()
ist schneller alssorted()
weil es keine Kopie erstellen muss. Für jedes andere iterable haben Sie keine Wahl.Nein, Sie können die ursprünglichen Positionen nicht abrufen. Sobald Sie angerufen haben, ist
list.sort()
die ursprüngliche Bestellung weg.quelle
None
, ist dies im Allgemeinen ein Zeichen dafür, dass die Vorgänge ordnungsgemäß ausgeführt wurden. Wenn Sie sie drucken möchten, wird im Allgemeinenlist.sort()
None zurückgegeben.list.sort
mutiert die Liste an Ort und Stelle und kehrt zurückNone
sorted
Nimmt eine beliebige iterable & gibt eine neue Liste zurück, sortiert.sorted
entspricht dieser Python-Implementierung, aber die in CPython integrierte Funktion sollte messbar schneller ausgeführt werden, da sie in C geschrieben ist:list.sort
Sie diese wenn Sie die ursprüngliche Sortierreihenfolge nicht beibehalten möchten (damit Sie die Liste direkt im Speicher wiederverwenden können) und wenn Sie der alleinige Eigentümer der Liste sind (wenn die Liste von einem anderen Code gemeinsam genutzt wird und Sie mutieren Sie es, Sie könnten Fehler einführen, wo diese Liste verwendet wird.)sorted
Sie diese Option, wenn Sie die ursprüngliche Sortierreihenfolge beibehalten oder eine neue Liste erstellen möchten, die nur Ihrem lokalen Code gehört.Nein - wenn Sie nicht selbst eine Kopie erstellt haben, gehen diese Informationen verloren, da die Sortierung an Ort und Stelle erfolgt.
Verwenden Sie das timeit-Modul, um die Nachteile beim Erstellen einer neuen Liste zu veranschaulichen. Hier ist unser Setup:
Und hier sind unsere Ergebnisse für eine Liste zufällig angeordneter 10000 Ganzzahlen. Wie wir hier sehen können, haben wir einen älteren Mythos der Kosten für die Erstellung von Listen widerlegt :
Python 2.7
Python 3
Nach einigen Rückmeldungen entschied ich, dass ein weiterer Test mit unterschiedlichen Eigenschaften wünschenswert wäre. Hier stelle ich die gleiche zufällig angeordnete Liste mit einer Länge von 100.000 für jede Iteration 1000 Mal zur Verfügung.
Ich interpretiere den Unterschied dieser größeren Sorte, der sich aus dem von Martijn erwähnten Kopieren ergibt, aber er dominiert nicht bis zu dem Punkt, der in der älteren, populäreren Antwort hier angegeben ist, hier beträgt die Zeitzunahme nur etwa 10%
Ich habe das oben genannte auch auf einer viel kleineren Sorte ausgeführt und festgestellt, dass die neue
sorted
Kopierversion bei einer Länge von 1000 noch etwa 2% länger dauert.Poke hat auch seinen eigenen Code ausgeführt. Hier ist der Code:
Er fand für 1000000 Längensortierung (100-mal ausgeführt) ein ähnliches Ergebnis, aber nur etwa 5% mehr Zeit, hier ist die Ausgabe:
Fazit:
Eine große Liste, die beim
sorted
Erstellen einer Kopie sortiert wird, dominiert wahrscheinlich die Unterschiede, aber die Sortierung selbst dominiert den Vorgang, und das Organisieren Ihres Codes um diese Unterschiede herum wäre eine vorzeitige Optimierung. Ich würde verwenden,sorted
wenn ich eine neue sortierte Liste der Daten benötige, und ich würde verwenden,list.sort
wenn ich eine Liste direkt sortieren muss, und dies meine Verwendung bestimmen lassen.quelle
sorted()
ein neues Listenobjekt zugewiesen und die Referenzen kopiert werden müssen. Die restlichen Codepfade sind identisch. Überprüfen Sie, ob Sie dieselben Tests mit größeren Listen ausführen können. Vergleichen Sie es mit dem Erstellen von Kopien von Listen und prüfen Sie, ob Sie die gefundenen Unterschiede usw. replizieren können.Der Hauptunterschied besteht darin, dass
sorted(some_list)
ein neues zurückgegeben wirdlist
:und
some_list.sort()
, sortiert die Liste an Ort und Stelle :Beachten Sie, dass, da
a.sort()
nichts zurückgegebenprint a.sort()
wird, gedruckt wirdNone
.Kann eine Liste der ursprünglichen Positionen nach list.sort () abgerufen werden?
Nein, da dadurch die ursprüngliche Liste geändert wird.
quelle
print a.sort()
druckt nichts.None
, das werde ich klarstellen.Die Funktion .sort () speichert den Wert der neuen Liste direkt in der Listenvariablen. Die Antwort auf Ihre dritte Frage wäre NEIN. Auch wenn Sie dies mit sortiert (Liste) tun, können Sie es verwenden, da es nicht in der Listenvariablen gespeichert ist. Manchmal fungiert die Methode .sort () auch als Funktion oder sagt, dass sie Argumente enthält.
Sie müssen den Wert von sortiert (Liste) explizit in einer Variablen speichern.
Auch bei kurzer Datenverarbeitung spielt die Geschwindigkeit keine Rolle. aber für lange Listen; Sie sollten die .sort () -Methode direkt verwenden, um schnell arbeiten zu können. Aber auch hier werden Sie irreversiblen Handlungen ausgesetzt sein.
quelle
list.sort()
Methode sortiert das Listenobjekt direkt..sort()
nimmt die Methode Argumente und fungiert als Funktion. Wir nennen es auch Methode, weil es ein Attribut des Listendatentyps ist.Hier sind einige einfache Beispiele, um den Unterschied in der Aktion zu sehen:
Siehe die Liste der Nummern hier:
Wenn Sie
sorted
diese Liste aufrufen ,sorted
wird eine Kopie der Liste erstellt. (Das heißt, Ihre ursprüngliche Liste bleibt unverändert.)Mal schauen.
kehrt zurück
Mit Blick auf die
nums
wiederWir sehen die ursprüngliche Liste (unverändert und NICHT sortiert).
sorted
hat die ursprüngliche Liste nicht geändertWenn Sie dieselbe
nums
Liste verwenden und diesort
Funktion darauf anwenden , wird die tatsächliche Liste geändert.Mal schauen.
Beginnen Sie mit unserer
nums
Liste, um sicherzustellen, dass der Inhalt immer noch der gleiche ist.Jetzt wird die ursprüngliche Nummernliste geändert und wenn wir uns die Nummern ansehen, sehen wir, dass sich unsere ursprüngliche Liste geändert hat und jetzt sortiert ist.
quelle
sort () gibt keinen Wert zurück.
Die sort () -Methode sortiert nur die Elemente einer bestimmten Liste in einer bestimmten Reihenfolge - Aufsteigend oder Absteigend, ohne einen Wert zurückzugeben.
Die Syntax der sort () -Methode lautet:
quelle