2012-07-28 30 views
10

Bạn có thể sắp xếp một mảng của myclass bằng lập luận key đến sorted chức năng:Python: Sắp xếp lớp tùy chỉnh mà không sử dụng đối số `khóa`?

sortedlist = sorted(myclasses, key=lambda obj: obj.myproperty) 

Có cách nào để xác định một trật tự tự nhiên cho các lớp học của chúng tôi? Có lẽ một số phương pháp kỳ diệu để chúng ta không phải vượt qua một chìa khóa mỗi lần?

ví dụ

class myclass: 
    def __init__(self,a,b): 
     self.key1 = a 
     self.key2 = b 

    def __sortkey__(self): 
     return self.key2 

Hoặc sẽ một cách tự nhiên có tác dụng nếu chúng ta định nghĩa __le__ lẽ?

Trả lời

3

tôi muốn làm điều đó bằng cách ghi đè __cmp__

class myclass: 
    def __init__(self,a,b): 
     self.key1 = a 
     self.key2 = b 

    def __cmp__(self, other): 
     return cmp(self.key2, other.key2) 
+0

Ah. Tốt đẹp! Không thể tìm thấy nó trong http://docs.python.org/library/functions.html#sorted – mpen

+8

Lưu ý rằng '__cmp__' không hoạt động trong Python 3 – samfrances

13

Ngoài __cmp__, bạn cũng có thể làm điều đó với cái gọi là "toán tử so sánh giàu" __eq__, __le__, __lt__, __gt__, và __ge__. Thay vì xác định tất cả chúng, bạn có thể sử dụng trang trí lớp học functools.total_ordering trong 2.7 +/3.1 +. __cmp__ đã biến mất trong 3.x.

+1

Thậm chí tốt hơn. '__le__' dễ thực hiện hơn vì tôi chỉ cần trả về một bool. – mpen

Các vấn đề liên quan