Wie sortiere ich eine Liste von Datums- / Uhrzeit- oder Datumsobjekten?

77

Wie sortiere ich eine Liste von Datums- und / oder Datums- / Uhrzeitobjekten? Die akzeptierte Antwort hier arbeitet nicht für mich:

from datetime import datetime,date,timedelta


a=[date.today(), date.today() + timedelta(days=1), date.today() - timedelta(days=1)]
print a # prints '[datetime.date(2013, 1, 22), datetime.date(2013, 1, 23), datetime.date(2013, 1, 21)]'
a = a.sort()
print a # prints 'None'....what???
user_78361084
quelle
1
lst.sort () ist eine Inplace-Operation
Andreas Jung
1
Haben Sie den Inplace- Betrieb gelesen ? Warum sollte die Methode etwas zurückgeben, das für die vorhandene Datenstruktur ausgeführt wird? Es wird keine neue Liste erstellt und die vorhandene Liste wird nicht zurückgegeben. Dies ist ein völlig absichtliches und dokumentiertes Verhalten, Bruder.
Andreas Jung
1
Ich habe sorted()ein Listenverständnis wie folgt verwendet : sorted([datetime.strptime(dt, "%Y-%m-%d %H:%M:%S") for dt in dateList]). Meine Daten waren Zeichenfolgen, die aussahen wie: '2018-09-07 19:00:46'
Grant Shannon

Antworten:

123

Sie erhalten, Noneweil list.sort()es an Ort und Stelle funktioniert , was bedeutet, dass es nichts zurückgibt, sondern die Liste selbst ändert. Sie müssen nur anrufen, a.sort()ohne es aerneut zuzuweisen .

Es gibt eine eingebaute Funktion sorted(), die eine sortierte Version der Liste zurückgibt - a = sorted(a)sie macht auch, was Sie wollen.

Volatilität
quelle
3
Welcher Weg ist der beste? Tun sie das Gleiche unter der Decke?
Radtek
2
@radtek list.sort()ändert das Objekt, von dem aus es aufgerufen wird (was immer eine Liste ist). sorted()funktioniert auf jeder iterierbaren, nicht nur Liste. list.sort()Dies ist möglicherweise etwas schneller, wenn Sie eine sehr große Liste haben, da sorted()eine neue Liste erstellt wird und die Elemente darauf kopiert werden müssen.
Flyman