2016-01-10 81 views
5

嵌套列表比方說,我有一個列表如下圖所示:排序由兩個元素

[['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` 

我想排序它:

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

所以第一個排序是由得分降序排列,並然後按名稱升序排序。


我已經試過:

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

它的工作,所以現在我只需要扭轉這種局面:

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

啊,reverse=True根本扭轉列表中,但沒有給預期產出。所以我只想扭轉int(x[1])的輸出,但不是x[0]

我該怎麼做?

回答

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

基本上,通過改變關鍵的分數部分的符號,排序鍵將是:

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

因此,與(a, b) < (c, d) <=> (a < c) or (a == c and b < d),你最終獲得您想要的排列順序。