Danh sách Python sắp xếp theo thứ tự giảm dần


334

Làm thế nào tôi có thể sắp xếp danh sách này theo thứ tự giảm dần?

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

Câu trả lời:


386

Trong một dòng, sử dụng một lambda:

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

Truyền một hàm cho list.sort:

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

timestamp.sort(key=foo, reverse=True)

13
Việc chuyển đổi thành một tuple thời gian là không cần thiết.
Marcelo Cantos

2
@Marcelo: Chỉ bởi sự trùng hợp.
Ignacio Vazquez-Abrams

16
@ IgnacioVazquez-Abrams không, không phải ngẫu nhiên. ISO 8601 được thiết kế rõ ràng sao cho thứ tự bảng chữ cái trùng khớp với thứ tự thời gian.
JWG

@jwg Đồng ý với tình cảm (rõ ràng là do thiết kế, không phải là trùng hợp ngẫu nhiên), nhưng định dạng đã cho không phù hợp với ISO 8601.
Marcelo Cantos

2
@jwg có một khoảng cách giữa các thành phần ngày và thời gian.
Marcelo Cantos

381

Điều này sẽ cung cấp cho bạn một phiên bản sắp xếp của mảng.

sorted(timestamp, reverse=True)

Nếu bạn muốn sắp xếp tại chỗ:

timestamp.sort(reverse=True)

2
reverseđã được thêm vào 2.4. Nhưng lưu ý rằng sort()nó ổn định, vì vậy hai bit mã được cung cấp sẽ không nhất thiết cho cùng một kết quả.
Ignacio Vazquez-Abrams

3
@Rajeev - đừng quên bạn chỉ có thể sắp xếp ngày nếu chúng được viết theo cách này (YYYY-MM-DD HH: MM: SS), trong đó theo thứ tự bảng chữ cái giống như theo thứ tự thời gian. 'DD.MM.YYYY' sẽ là một ví dụ điển hình, nơi bạn sẽ cần nhiều hơn là chỉ sort(reverse=True).
eumiro

in ("Danh sách trước khi sắp xếp"); in (myList); myList.sort (đảo ngược = Đúng); print ("sortList:" + str (myList));
Erum

@Erum đó là một câu trả lời, không phải là một bình luận, và như một câu trả lời, nó là dư thừa.
Marcelo Cantos

56

Bạn chỉ có thể làm điều này:

timestamp.sort(reverse=True)

10

Vì danh sách của bạn đã theo thứ tự tăng dần, chúng tôi chỉ cần đảo ngược danh sách.

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

bạn loại đơn giản:

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

Đây là một câu trả lời kỳ lạ bởi vì bạn thực hiện sắp xếp tại chỗ nhưng sau đó đảo ngược ra khỏi vị trí. Nếu có một biến khác đặt bí danh cho danh sách gốc, giá trị của nó sau đó sẽ không có các phần tử theo thứ tự ban đầu, cũng không theo thứ tự giảm dần; bí danh sẽ trỏ đến một danh sách được sắp xếp theo thứ tự tăng dần . Điều đó có thể khá đáng ngạc nhiên, và là một nguồn lỗi tinh vi.
kaya3

0

Đây là một cách khác


timestamp.sort()
timestamp.reverse()
print(timestamp)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.