Sortowanie listy w języku Python w porządku malejącym

334

Jak mogę posortować tę listę w kolejności malejącej?

timestamp = [
    "2010-04-20 10:07:30",
    "2010-04-20 10:07:38",
    "2010-04-20 10:07:52",
    "2010-04-20 10:08:22",
    "2010-04-20 10:08:22",
    "2010-04-20 10:09:46",
    "2010-04-20 10:10:37",
    "2010-04-20 10:10:58",
    "2010-04-20 10:11:50",
    "2010-04-20 10:12:13",
    "2010-04-20 10:12:13",
    "2010-04-20 10:25:38"
]
Rajeev
źródło

Odpowiedzi:

387

W jednym wierszu za pomocą lambda:

timestamp.sort(key=lambda x: time.strptime(x, '%Y-%m-%d %H:%M:%S')[0:6], reverse=True)

Przekazywanie funkcji do list.sort:

def foo(x):
    return time.strptime(x, '%Y-%m-%d %H:%M:%S')[0:6]

timestamp.sort(key=foo, reverse=True)
Ignacio Vazquez-Abrams
źródło
13
Konwersja na krotkę czasową jest niepotrzebna.
Marcelo Cantos
2
@Marcelo: Tylko przez przypadek.
Ignacio Vazquez-Abrams,
16
@ IgnacioVazquez-Abrams nie, nie przez przypadek. ISO 8601 jest specjalnie zaprojektowany, aby porządek alfabetyczny pokrywał się z porządkiem chronologicznym.
jwg
@jwg Zgadzam się z sentymentem (jest to z założenia projekt, a nie przypadek), ale podany format nie jest zgodny z ISO 8601.
Marcelo Cantos
2
@jwg między komponentami daty i godziny jest spacja.
Marcelo Cantos
381

To da posortowaną wersję tablicy.

sorted(timestamp, reverse=True)

Jeśli chcesz sortować w miejscu:

timestamp.sort(reverse=True)
Marcelo Cantos
źródło
2
reversezostał dodany w 2.4. Pamiętaj jednak, że sort()jest stabilny, więc podane dwa bity kodu niekoniecznie dadzą ten sam wynik.
Ignacio Vazquez-Abrams,
3
@Rajeev - nie zapomnij, że możesz sortować daty tylko wtedy, gdy są one zapisane w ten sposób (RRRR-MM-DD GG: MM: SS), gdzie alfabetycznie jest to samo, co chronologicznie. „DD.MM.RRRR” byłoby dobrym przykładem, w którym potrzebujesz więcej niż tylko sort(reverse=True).
eumiro,
print („Lista przed sortowaniem”); print (moja lista); myList.sort (reverse = True); print („sortedList:” + str (myList));
Erum,
@Erum to odpowiedź, a nie komentarz, a jako odpowiedź jest zbędna.
Marcelo Cantos,
56

Możesz po prostu to zrobić:

timestamp.sort(reverse=True)
Wolph
źródło
10

Ponieważ twoja lista jest już w porządku rosnącym, możemy po prostu odwrócić listę.

>>> timestamp.reverse()
>>> timestamp
['2010-04-20 10:25:38', 
'2010-04-20 10:12:13', 
'2010-04-20 10:12:13', 
'2010-04-20 10:11:50', 
'2010-04-20 10:10:58', 
'2010-04-20 10:10:37', 
'2010-04-20 10:09:46', 
'2010-04-20 10:08:22',
'2010-04-20 10:08:22', 
'2010-04-20 10:07:52', 
'2010-04-20 10:07:38', 
'2010-04-20 10:07:30']
Russell Dias
źródło
9

ty prosty typ:

timestamp.sort()
timestamp=timestamp[::-1]
mostafa elmadany
źródło
To dziwna odpowiedź, ponieważ sortujesz w miejscu, a następnie cofasz w miejscu. Jeśli istnieje inna zmienna aliasingująca pierwotną listę, wówczas jej wartość nie będzie miała elementów w ich oryginalnej kolejności ani w kolejności malejącej; alias będzie wskazywał na listę posortowaną w porządku rosnącym . To może być dość zaskakujące i źródłem subtelnych błędów.
kaya3
0

Oto inny sposób


timestamp.sort()
timestamp.reverse()
print(timestamp)
I_code
źródło