2011-07-12 27 views
25

nếu tôi có một danh sách có chứa một danh sách giống như thế này ...Python danh sách loại danh sách/tăng dần và sau đó decending

['a',1] ['a',2] ['a',3] ['b',1] ['b',2] ['b',3] 

làm thế nào tôi có thể sắp xếp chúng sao cho phần tử 0 được sắp xếp giảm dần và yếu tố 1 được sắp xếp tăng dần nên kết quả sẽ như thế nào ...

['b',1] ['b',2] ['b',3] ['a',1] ['a',2] ['a',3] 

Sử dụng itemgetter tôi có thể vượt qua trong ngược trên phần tử 0 nhưng sau đó tôi tôi nghỉ mát chống lại yếu tố để tất nhiên nó tàn tích các loại trước đó. Tôi không thể làm một phím kết hợp vì nó cần phải sắp xếp thứ tự giảm dần và sau đó tăng dần.

TIA, PK

Trả lời

32
L = [['a',1], ['a',2], ['a',3], ['b',1], ['b',2], ['b',3]] 
L.sort(key=lambda k: (k[0], -k[1]), reverse=True) 

L bây giờ chứa:

[['b', 1], ['b', 2], ['b', 3], ['a', 1], ['a', 2], ['a', 3]] 
+0

Sẽ chấp nhận ngay khi nó cho phép tôi. Đây chính xác là những gì tôi cần. Tôi đang làm việc trên một vị trí bin/kho định tuyến vấn đề cho danh sách lựa chọn trong kho của chúng tôi và điều này đã làm các trick. Nếu bạn có thời gian, bạn có thể giải thích "lambda k: (k [0], - k [1])" là gì? Dấu âm có nghĩa ngược lại không? Tôi có thể nhận được kết quả tương tự với lambda k: (-k [0], k [1]) mà không có đối số ngược lại không? – Ominus

+0

@Ominus: '-k [1]' lật dấu trên số nguyên đảo ngược thứ tự sắp xếp tự nhiên của chúng. Bạn không thể làm '-k [0]' vì giá trị đó là một chuỗi. Vì vậy, 'reverse = True' đảo ngược thứ tự sắp xếp và' -k [1] 'hủy bỏ sự đảo ngược trên phần tử thứ hai. –

2

Something như

def mycmp(a, b): 

    res = cmp(a[0], b[0]) 
    if res == 0: 
    return cmp(a[1], b[1]) 
    return res 

newlist = sorted(input_list, cmp=mycmp) 

Phương pháp so sánh đầu tiên kiểm tra các hạng mục đầu tiên của mỗi phần tử. Nếu chúng bằng nhau, nó sẽ kiểm tra các mục thứ hai của mỗi phần tử. Giá trị trả về bên trong việc thực hiện mycmp() có thể bị từ chối để thực hiện một hành vi sắp xếp khác nhau.

25

Bạn có thể thực hiện các vòng phân loại liên tiếp là python sortstable. Trước tiên, bạn cần phải sắp xếp trên khóa phụ chính. Xem thêm official HOW TO.

from operator import itemgetter 
l = [['a',2], ['a',1], ['b', 2], ['a',3], ['b',1], ['b',3]] 
l.sort(key=itemgetter(1)) 
l.sort(key=itemgetter(0), reverse=True) 
# [['b', 1], ['b', 2], ['b', 3], ['a', 1], ['a', 2], ['a', 3]] 
Các vấn đề liên quan