Theo tài liệu heapq , cách để tùy chỉnh thứ tự heap là để mỗi phần tử trên heap là một bộ tuple, với phần tử tuple đầu tiên là một phần tử chấp nhận các so sánh Python bình thường.
Các hàm trong mô-đun heapq hơi cồng kềnh (vì chúng không phải là hướng đối tượng) và luôn yêu cầu đối tượng heap của chúng ta (danh sách được đống hóa) phải được chuyển rõ ràng làm tham 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 một lớp wrapper rất đơn giản cho phép chúng ta chỉ định một key
hàm và trình bày heap dưới dạng một đối tượng.
Lớp bên dưới giữ một danh sách nội bộ, trong đó mỗi phần tử là một bộ, thành viên đầu tiên của nó là một khóa, được tính tại thời điểm chèn phần tử bằng cách sử dụng key
tham số, được truyền vào lúc khởi tạo Heap:
import heapq
class MyHeap(object):
def __init__(self, initial=None, key=lambda x:x):
self.key = key
self.index = 0
if initial:
self._data = [(key(item), i, item) for i, item in enumerate(initial)]
self.index = len(self._data)
heapq.heapify(self._data)
else:
self._data = []
def push(self, item):
heapq.heappush(self._data, (self.key(item), self.index, item))
self.index += 1
def pop(self):
return heapq.heappop(self._data)[2]
(Phần bổ sung self.index
là để tránh xung đột khi giá trị khóa được đánh giá là một trận hòa và giá trị được lưu trữ không thể so sánh trực tiếp - nếu không heapq có thể không thành công với TypeError)