2013-05-14 37 views
5

Hãy nói tôi có:Làm thế nào để sắp xếp trong việc giảm giá trị đầu tiên sau đó tăng giá thứ hai

student_tuples = [ ('john', 'A', 15), 
        ('peter', 'B', 12), 
        ('dave', 'C', 12)] 

Làm thế nào để sắp xếp nó là như thế này:

student_tuples = [('john', 'A', 15), ('dave', 'C', 12), ('peter', 'B', 12)] 

Những gì tôi có thể nghĩ đến là:

from operator import itemgetter 

sorted(student_tuples, key=itemgetter(2,0), reverse=True) 

nhưng sau đó đầu ra sẽ là:

student_tuples = [('john', 'A', 15), ('peter', 'B', 12), ('dave', 'C', 12)] 

và đó không phải là điều tôi muốn. Làm thế nào tôi có thể làm điều đó bằng cách sử dụng itemgetter hoặc bất kỳ cách nào khác dễ dàng hơn?

+0

Kiểm tra này [post] (http://stackoverflow.com/questions/3121979/how-to-sort-list-tuple-of-lists-tuples). Tôi nghĩ có mọi thứ bạn cần. – ibi0tux

+0

Đối với những gì nó có giá trị, tôi không tin rằng đây là một bản sao. Câu hỏi này đặc biệt yêu cầu cách sắp xếp theo một phím giảm dần và một phím tăng dần, trong khi "trùng lặp" chỉ hỏi về nhiều khóa. – RichieHindle

+2

Không, nó thay vào đó là một bản sao của [Python: Danh sách sắp xếp với nhiều thuộc tính và thứ tự hỗn hợp] (http://stackoverflow.com/q/1516249) –

Trả lời

9

này làm nó:

print sorted(student_tuples, key=lambda t: (-t[2], t[0])) 
# [('john', 'A', 15), ('dave', 'C', 12), ('peter', 'B', 12)] 
+0

Sắp xếp theo hai lần là một cách tốt hơn để thực hiện. Cách tiếp cận khóa phủ định chỉ hoạt động với các phím số. –

5

Viết chức năng khóa nhận của riêng bạn.

student_tuples = [ ('john', 'A', 15), ('peter', 'B', 12), ('dave', 'C', 12)] 

def student_key(args): 
    name, letter, number = args 
    return (-number, name) 

>>> sorted(student_tuples, key=student_key) 
[('john', 'A', 15), ('dave', 'C', 12), ('peter', 'B', 12)] 
+0

chắc chắn là cách dễ đọc nhất – jamylak

+0

@Schoolboy Có họ giống nhau, chỉ thấy anh ấy khi tôi đăng của riêng tôi. Tôi sẽ không đăng nó nếu tôi đã nhìn thấy anh ấy. SO có chính sách về những tình huống này không? –

+0

@Schoolboy Không, nó không hoàn toàn giống nhau: trong giải pháp của Adrian, có giải nén, điều đó có nghĩa là ba việc gán các đối tượng để nhận dạng '' tên, chữ cái, số'' không cần thiết, như giải pháp của RichieHindle. – eyquem

3

Trong trường hợp bạn không có một trường số có thể dễ dàng phủ nhận, sau đó bạn luôn có thể làm hai giai đoạn phân loại, dựa trên thực tế là Python của .sort là ổn định:

student_tuples.sort(key=itemgetter(0)) 
student_tuples.sort(key=itemgetter(2), reverse=True) 
+0

+1 Đây là cách dự định để thực hiện. –

2

Tổ chức các loại. Sắp xếp ưu tiên hàng đầu/quan trọng nhất trong loại ngoài cùng.

student_tuples = [ ('john', 'A', 15), 
        ('peter', 'B', 12), 
        ('dave', 'C', 12)] 

from operator import itemgetter 

sorted_ = sorted(sorted(student_tuples,key = itemgetter(0)), key=itemgetter(2), reverse=True) 

cho

>>> sorted_ 
[('john', 'A', 15), ('dave', 'C', 12), ('peter', 'B', 12)] 
Các vấn đề liên quan