2016-01-10 23 views
5

Hãy nói rằng tôi có một danh sách như dưới đây:Sắp xếp một danh sách lồng nhau bởi hai yếu tố

[['Harry', '4'], ['Anthony', '10'], ['Adam', '7'], ['Joe', '6'], ['Ben', '10']] 
# we can say the first element in it's lists is `name`, the second is `score` 

Tôi muốn sắp xếp nó để:

[['Anthony', '10'], ['Ben', '10'], ['Adam', '7'], ['Joe', '6'], ['Harry', '4']] 

loại Vì vậy, đầu tiên nó theo thứ tự giảm dần theo điểm số và sau đó sắp xếp nó theo thứ tự tăng dần theo tên.


Tôi đã thử:

>>> sorted(l, key=lambda x: (int(x[1]), x[0])) 
[['Harry', '4'], ['Joe', '6'], ['Adam', '7'], ['Anthony', '10'], ['Ben', '10']] 

Đó là làm việc, vì vậy bây giờ tôi chỉ cần đảo ngược nó:

>>> sorted(l, key=lambda x: (int(x[1]), x[0]), reverse=True) 
[['Ben', '10'], ['Anthony', '10'], ['Adam', '7'], ['Joe', '6'], ['Harry', '4']] 

Ah, reverse=True chỉ đơn giản là đảo ngược danh sách nhưng không cung cấp cho các mong đợi đầu ra. Vì vậy, tôi chỉ muốn đảo ngược đầu ra của int(x[1]), nhưng không phải là x[0].

Tôi có thể làm như thế nào?

Trả lời

6
>>> sorted(l, key=lambda x: (-int(x[1]), x[0])) 
[['Anthony', '10'], ['Ben', '10'], ['Adam', '7'], ['Joe', '6'], ['Harry', '4']] 

Về cơ bản, bằng cách thay đổi các dấu hiệu của một phần số điểm là chìa khóa, chìa khóa loại sẽ là:

(-10, 'Anthony'), 
(-10, 'Ben'), 
(-7, 'Adam'), 
(-6, 'Joe'), 
(-4, 'Harry') 

Và như vậy, với (a, b) < (c, d) <=> (a < c) or (a == c and b < d), bạn kết thúc với thứ tự sắp xếp mong muốn của bạn.

Các vấn đề liên quan