2016-01-10 17 views
5

Diciamo che ho una lista come di seguito:Ordinamento di un elenco nidificato da due elementi

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

voglio sorta a:

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

Così Ordina in ordine decrescente di punteggio e quindi ordinalo in ordine crescente per nome.


ho provato:

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

E 'di lavoro, così ora ho solo bisogno di invertire tale tendenza:

>>> 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 semplicemente invertito la lista, ma non ha dato il aspettarsi uscita. Quindi voglio solo invertire l'output di int(x[1]), ma non x[0].

Come posso farlo?

risposta

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

In sostanza, cambiando il segno della parte punteggio della chiave, le chiavi di ordinamento saranno:

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

E così, con (a, b) < (c, d) <=> (a < c) or (a == c and b < d), si finisce con l'ordine di classificazione desiderato.

Problemi correlati