2013-04-24 24 views
6

Nếu tôi có danh sách các số [4,2,5,1,3] Tôi muốn sắp xếp nó trước tiên theo một số chức năng f và sau đó cho các số có cùng giá trị f tôi muốn nó được sắp xếp theo độ lớn của số.Làm cách nào để thực hiện phân loại thứ cấp trong python?

Mã này dường như không hoạt động.

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

Phân loại thứ nhất: danh sách5 được sắp xếp dựa trên độ lớn. Phân loại chính tiếp theo: list5 được sắp xếp dựa trên một số chức năng của các số.

+1

btw bạn chỉ có thể làm 'key = degree', ở đây 'lambda' là không cần thiết – GP89

+0

Khi bạn nói nó "dường như không có tác dụng", những gì bạn có quan sát không – ecatmur

Trả lời

30

Sắp xếp nó bằng một (firstkey, secondkey) tuple:

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

Để làm tăng dần trên một và giảm dần trên khác, hai cuộc gọi: list5.sort (key = lambda vertex: vertext, reverse = True) list5.sort (key = lambda vertex: độ (vertext)) –

+0

Tôi thấy tại sao điều này là một giải pháp rất dễ đọc, là một giải pháp rất hiệu quả cũng tồn tại? Không tự viết mã, nghĩa là không tính giá trị thứ hai khi không cần thiết. – borgr

2

Trên điện thoại, nhưng loại youcan bởi tuple.

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

Đừng quên cờ ngược lại nếu bạn cần.

1

Từ Python 3 tài liệu trên 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')) 
Các vấn đề liên quan