【Python学习笔记】heapq模块

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))


应用

项目收益问题

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值