heapq +__lt__
自定义对象结构,并重载__lt__
操作符
# 实现大根堆
import heapq
class MyObject:
def __init__(self, val):
self.val = val
def __lt__(self, other):
return self.val > other.val
q = []
heapq.heappush(q, MyObject(50))
heapq.heappush(q, MyObject(40))
heapq.heappush(q, MyObject(30))
heapq.heappush(q, MyObject(20))
heapq.heappush(q, MyObject(200))
obj = heapq.heappop(q)
print(obj.val)
heapq+lambda
https://stackoverflow.com/questions/8875706/heapq-with-custom-compare-predicate
1、heapq模块可以接受元组对象,默认元组的第一个元素作为priority
,即按照元组的第一个
元素构成小根堆
heappush( Q , tuple )
2、如果想要按照元组中的其他元素
构成小根堆,在原来基础上加个优先级
即可:
heappush( Q , ( priority, tuple ) )
priority = key(tuple[i])
key=lambda x:f(x)
from heapq import *
def FindMaxProfit(profits, key=lambda x: -x):
maxHeap1, maxHeap2 = [], []
for i in range(len(profits)):
# 以下方法效果一致,若需构建大根堆,推荐第一种
heappush(maxHeap1, (-profits[i], profits[i]))
heappush(maxHeap2, (key(profits[i]), profits[i]))
return heappop(maxHeap1), heappop(maxHeap2)
# for test
profits = [3, 2, 4, 9]
print(FindMaxProfit(profits)) # ((-9, 9), (-9, 9))