2012-07-12 30 views
6

Tôi có một danh sách các hàng:Sắp xếp phức tạp với nhiều thông số?

li = [('fink', 3), ('flip', 3), ('flock', 4), ('foo', 12), ('foot', 20), ('football', 20), ('futz', 10), ('flip', 3), ('flank', 3), ('flop', 3)] 

Làm thế nào tôi có thể sắp xếp danh sách theo số gốc đầu tiên và sau đó theo thứ tự abc giảm dần? Kết quả sẽ là:

('foot', 20) 
('football', 20) 
('foo', 12) 
('futz', 10) 
('flock', 4) 
('fink', 3) 
('flip', 3) 
('flake', 3) 
('flop', 3) 

from operator import itemgetter 

sorted_li = sorted(li, key=itemgetter(1,0), reverse=True) 

Khi mã ở trên sắp xếp theo số giảm dần chính xác, các từ không được sắp xếp theo thứ tự bảng chữ cái.

+0

có thể trùng lặp với [Tiêu chí sắp xếp nâng cao cho danh sách các bộ dữ liệu lồng nhau] (http://stackoverflow.com/questions/3831449/advanced-sorting-criteria-for-a-list-of-nested-tuples) – eumiro

Trả lời

9

này quá phức tạp đối với một đơn itemgetter. Sử dụng lambda thay vì:

sorted_li = sorted(li, key=lambda x: (-x[1], x[0])) 

Đó là về tốc độ tương tự như hai loại liên tiếp sử dụng itemgetter, nhưng nó là mã ít hơn và có lẽ dễ đọc hơn.

+0

Điều này hoạt động bởi vì bạn có thể sử dụng thực tế một yếu tố sắp xếp là một số. Nếu cả hai đều là chuỗi? –

+1

@JonClements Ông sẽ sử dụng giải pháp của bạn :) – jamylak

6

Là loại Python là ổn định, đó là dễ dàng nhất để sắp xếp hai lần:

sorted_li = sorted(li, key=itemgetter(1), reverse=True) 
sorted_li.sort(key=itemgetter(0)) 
Các vấn đề liên quan