python heapq和accumulate

主要为了刷题时候,总是出现堆和前缀和等python内置库,做个记录

1 heapq

  heapq 库是Python标准库之一,提供了构建小顶堆的方法和一些对小顶堆的基本操作方法(如入堆,出堆等),可以用于实现堆排序算法。堆是一种数据结构,是一颗完全二叉树,满足的性质:每个节点的值都大于等于(小于等于)它的左右子节点的值。在python heapq中使用的是小顶堆。
   在heapq库中,heapq使用的数据类型是python的基本数据类型list,要满足堆的性质,则在索引k的值要<= 2k+1 和 2k+2 的值。

1.1 heapq创建堆
# coding=utf-8
import heapq
 
array = [10, 17, 50, 7, 30, 24, 27, 45, 15, 5, 36, 21]
heap = []
for num in array:
    heapq.heappush(heap, num)
print("array:", array)
print("heap: ", heap)
 
heapq.heapify(array)
print("array:", array)

# 打印的结果
'''
array: [10, 17, 50, 7, 30, 24, 27, 45, 15, 5, 36, 21]
heap:  [5, 7, 21, 15, 10, 24, 27, 45, 17, 30, 36, 50]
array: [5, 7, 21, 10, 17, 24, 27, 45, 15, 30, 36, 50]
'''

heapq中创建堆的方法有两种:

  • heappush(heap, num):先创建一个空堆,再将数据一个一个的添加到堆中
  • heapify(array):直接接收list数组,将list数组调整为小顶堆

两种方法实现的结果会有差异,如上面的代码中,使用heappush(heap, num)得到的堆结构如下。

在这里插入图片描述
使用heapify(array)得到的堆结构如下。
在这里插入图片描述
不过,这两个结果都满足小顶堆的特性,不影响堆的使用(堆只会从堆顶开始取数据,取出数据后会重新调整结构)。

1.2 heapq实现堆排序
array = [10, 17, 50, 7, 30, 24, 27, 45, 15, 5, 36, 21]
heap = []
for num in array:
    heapq.heappush(heap, num)
print(heap[0])
# print(heapq.heappop(heap))
heap_sort = [heapq.heappop(heap) for _ in range(len(heap))]
print("heap sort result: ", heap_sort)

# 利用heappop可以出堆操作,剩下的数据重新构造成新的小顶堆
# 打印的结果
'''
5
heap sort result:  [5, 7, 10, 15, 17, 21, 24, 27, 30, 36, 45, 50]
'''
1.3 获取堆中的最大值或最小值
array = [10, 17, 50, 7, 30, 24, 27, 45, 15, 5, 36, 21]
heapq.heapify(array)
print(heapq.nlargest(2, array)) # 从小顶堆中选出最大的两个数
print(heapq.nsmallest(3, array))

# 打印的结果
'''
[50, 45]
[5, 7, 10]
'''
1.4 将多个堆进行合并
li=[1, 1, 4, 2, 3, 5, 8]
li1=[2,1,2,3,2,4,6]
heapq.heapify(li)
heapq.heapify(li1)
lists=heapq.merge(li,li1)
print(list(lists))

'''
打印的结果
[1, 1, 2, 1, 2, 3, 2, 4, 2, 3, 4, 5, 6, 8]
'''

2 accumulate

accumulate(可迭代对象),功能是对传进来的iter对象逐个进行某个操作(默认是累加),详情见下面代码

>>> a=[1,2,3,4,5]
>>> b=accumulate(a)  #默认是累加
>>> b   #这里返回的是一个可迭代对象
<itertools.accumulate object at 0x7f3e5c2f4e48>
>>> list(b)   #强制转化
[1, 3, 6, 10, 15]
>>> 

传入自己想要的操作,例如换成乘法

>>> import operator
>>> c=accumulate(a,operator.mul)
>>> c
<itertools.accumulate object at 0x7f3e5c2f4f88>
>>> list(c)
[1, 2, 6, 24, 120]
>>> 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liiiiiiiiiiiiike

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值