2010-10-17 17 views

Trả lời

30

heapq cả các loại đối tượng theo cùng một cách list.sort không, vì vậy chỉ cần xác định một phương pháp __cmp__() trong định nghĩa lớp học của bạn, mà sẽ so sánh bản thân với một thể hiện của cùng lớp:

def __cmp__(self, other): 
    return cmp(self.intAttribute, other.intAttribute) 

trình bằng Python 2.x.

Trong sử dụng 3.x:

def __lt__(self, other): 
    return self.intAttribute < other.intAttribute 
+4

'__cmp__' đã biến mất trong 3.x. Sử dụng '__lt__' để thay thế. –

+7

'__lt__' cũng hoạt động trong Python 2, vì vậy tốt hơn hết là tránh' __cmp__' hoàn toàn. –

+8

Cũng giống như bạn có thể phân loại dựa trên tiêu chí khác với phân loại tự nhiên của đối tượng (ví dụ 'cmp' và' key' cho 'sort'), bạn có thể nói' heapq' để sắp xếp dựa trên khóa khác. Nói cách khác, bạn không cần phải * xác định lại chính đối tượng * để thay đổi một cấu trúc dữ liệu cụ thể đang nắm giữ nó; bạn sẽ có thể tự nói với cấu trúc dữ liệu. Đây là một phần cơ bản đáng chú ý còn thiếu trong API 'heapq'. –

3

Thật không may, bạn không thể, mặc dù đây là tính năng thường được yêu cầu.

Một tùy chọn sẽ là chèn (khóa, giá trị) vào bộ nhớ. Tuy nhiên, điều đó sẽ không hoạt động nếu các giá trị ném một ngoại lệ khi so sánh (chúng sẽ được so sánh trong trường hợp liên kết giữa các khóa).

Tùy chọn thứ hai là xác định phương thức __lt__ (ít hơn) trong lớp sẽ sử dụng thuộc tính thích hợp để so sánh các phần tử để sắp xếp. Tuy nhiên, điều đó có thể không thực hiện được nếu các đối tượng được tạo bởi một gói khác hoặc nếu bạn cần chúng để so sánh ở một nơi khác trong chương trình.

Tùy chọn thứ ba sẽ là sử dụng lớp sortedlist từ mô-đun blist (tuyên bố từ chối trách nhiệm: Tôi là tác giả). Hàm tạo cho số sortedlist có tham số key cho phép bạn chỉ định hàm trả về khóa sắp xếp của phần tử, tương tự như thông số key của list.sortsorted.

+0

Tôi đã xóa nhận xét trước của mình vì vấn đề của tôi với 'blist' có lẽ là PEBCAK (nhờ mô-đun của bạn), vì vậy tôi chỉ sao chép phần đầu tiên của nhận xét trước: Bạn luôn có thể xác định lớp học bằng' __lt__ 'hoặc thông qua phân lớp hoặc thông qua đóng gói. – tzot

23

Theo ví dụ từ documentation, bạn có thể sử dụng các bộ, và nó sẽ sắp xếp theo các yếu tố đầu tiên của tuple:

>>> h = [] 
>>> heappush(h, (5, 'write code')) 
>>> heappush(h, (7, 'release product')) 
>>> heappush(h, (1, 'write spec')) 
>>> heappush(h, (3, 'create tests')) 
>>> heappop(h) 
(1, 'write spec') 

Vì vậy, nếu bạn không muốn (hoặc không thể?) làm phương pháp __cmp__, bạn có thể trích xuất thủ công khóa sắp xếp của mình tại thời điểm đẩy.

Lưu ý rằng nếu các phần tử đầu tiên trong một cặp tuples bằng nhau, các phần tử khác sẽ được so sánh. Nếu đây không phải là những gì bạn muốn, bạn cần đảm bảo rằng mỗi phần tử đầu tiên là duy nhất.

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