2016-01-10 12 views
5

Powiedzmy mam listę jak poniżej:Sortuj zagnieżdżona lista dwoma elementami

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

Chcę sortowania go:

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

więc najpierw rozwiązać to w porządku malejącym według punktacji i następnie posortuj ją w porządku rosnącym według nazwy.


Próbowałem:

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

To działa, więc teraz po prostu trzeba odwrócić go:

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

Ach, reverse=True prostu odwrócić listę, ale nie dać oczekiwać produkcji. Więc chcę tylko odwrócić wyjście int(x[1]), ale nie x[0].

Jak mogę to zrobić?

Odpowiedz

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

Zasadniczo, zmieniając znak części nacięcia klucza, klucze sortowania będą:

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

I tak, z (a, b) < (c, d) <=> (a < c) or (a == c and b < d), możesz skończyć z żądanej kolejności sortowania.

Powiązane problemy