2013-04-24 9 views
6

Se si dispone di un elenco di numeri [4,2,5,1,3] Voglio ordinarlo prima con una qualche funzione f e quindi per i numeri con lo stesso valore di f voglio che venga ordinato in base alla grandezza del numero.Come si esegue l'ordinamento secondario in python?

Questo codice non sembra funzionare.

list5 = sorted(list5) 
list5 = sorted(list5, key = lambda vertex: degree(vertex)) 

Ordinamento secondario prima: la lista5 viene ordinata in base alla grandezza. Ordinamento primario successivo: lista5 è ordinata in base ad alcune funzioni dei numeri.

+1

btw si può solo fare 'key = degree', qui il' lambda' è ridondante – GP89

+0

Quando si dice che "non sembra funzionare", cosa osservi? – ecatmur

risposta

30

Ordina esso da una (firstkey, secondkey) tuple:

sorted(list5, key=lambda vertex: (degree(vertex), vertex)) 
+0

Per fare l'ascendente su uno e discendente sull'altro, due chiamate: lista5.sort (chiave = vertice lambda: vertext, reverse = True) list5.sort (chiave = lambda vertice: degree (vertext)) –

+0

Capisco perché questo è una soluzione molto leggibile, esiste anche una soluzione molto efficiente? Senza codificarlo da sé, cioè non calcolando il secondo valore quando non necessario. – borgr

2

Su un telefono, ma una sorta stagliano dal tupla.

sorted(list5, lambda x: (degree(x),x)) 

Non dimenticare la bandierina se ne hai bisogno.

1

Dalle Python 3 documenti su sorting

from operator import itemgetter, attrgetter 
student_objects = [ 
    Student('john', 'A', 15), 
    Student('jane', 'B', 12), 
    Student('dave', 'B', 10), 
] 
student_tuples = [ 
    ('john', 'A', 15), 
    ('jane', 'B', 12), 
    ('dave', 'B', 10), 
] 

#The operator module functions allow multiple levels of sorting. For example, to sort by grade then by age: 

sorted(student_tuples, key=itemgetter(1,2)) 
sorted(student_objects, key=attrgetter('grade', 'age')) 
Problemi correlati