2013-04-24 16 views
6

Jeśli mam listę numerów [4,2,5,1,3] Chcę ją najpierw posortować według niektórych funkcji f, a następnie dla liczb o tej samej wartości f chcę, aby była sortowana według wielkości liczby.Jak przeprowadzić sortowanie wtórne w pythonie?

Ten kod prawdopodobnie nie działa.

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

Po pierwsze sortowanie wtórne: lista5 jest sortowana na podstawie wielkości. Początkowe sortowanie: lista5 jest sortowana według niektórych funkcji liczb.

+1

btw można po prostu zrobić 'key = degree', tutaj' lambda' jest zbędny – GP89

+0

Kiedy mówisz, że "nie wydaje się działać", co obserwujesz? – ecatmur

Odpowiedz

30

Sortuj go przez (firstkey, secondkey) krotka:

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

Aby wykonać rosnąco na jednym i malejącym na drugim, dwa wywołania: list5.sort (klucz = lambda vertex: vertext, reverse = True) list5.sort (klucz = wierzchołek lambda: stopień (vertext)) –

+0

Rozumiem, dlaczego tak jest bardzo czytelne rozwiązanie, czy istnieje również bardzo wydajne rozwiązanie? Bez samodzielnego kodowania, tj. Bez obliczania drugiej wartości, gdy jest to niepotrzebne. – borgr

2

Na telefonie, ale youcan sortowania przez krotki.

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

Nie zapomnij o odwróconej flagie, jeśli jej potrzebujesz.

1

Z Python 3 docs na 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')) 
Powiązane problemy