Theo heapq documentation, cách để tùy chỉnh thứ tự vùng heap là có mỗi phần tử trên heap là một bộ tuple, với phần tử tuple đầu tiên là phần tử chấp nhận so sánh Python bình thường.
Các chức năng trong mô-đun heapq hơi cồng kềnh (vì chúng không hướng đối tượng) và luôn yêu cầu đối tượng heap (danh sách được heapified) của chúng tôi được truyền một cách rõ ràng làm thông số đầu tiên. Chúng ta có thể giết hai con chim bằng một viên đá bằng cách tạo ra một lớp bao bọc rất đơn giản cho phép chúng ta chỉ định một hàm key
, và trình bày vùng heap như một đối tượng.
Lớp dưới đây giữ một danh sách nội bộ, trong đó mỗi phần tử là một tuple, thành viên đầu tiên trong số đó là một chìa khóa, tính tại thời điểm chèn yếu tố sử dụng tham số key
, thông qua tại Heap instantiation:
# -*- coding: utf-8 -*-
import heapq
class MyHeap(object):
def __init__(self, initial=None, key=lambda x:x):
self.key = key
if initial:
self._data = [(key(item), item) for item in initial]
heapq.heapify(self._data)
else:
self._data = []
def push(self, item):
heapq.heappush(self._data, (self.key(item), item))
def pop(self):
return heapq.heappop(self._data)[1]
có thể trùng lặp của http://stackoverflow.com/questions/679731/min-heap-in-python –
bản sao có thể có của [Làm thế nào để làm cho heapq đánh giá heap off của một thuộc tính cụ thể?] (Http: // stackoverflow .com/questions/3954530/how-to-make-heapq-đánh giá-the-heap-off-of-a-cụ thể-thuộc tính) –