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"
]

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)

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)

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)

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']

9

ty prosty typ:

timestamp.sort()
timestamp=timestamp[::-1]

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)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.