功能介绍

该模块主要是用来实现堆排序。最大堆中的父节点大于或等于两个子节点,最小堆中的父节点小于或等于子节点

创建堆

在heapq中有两种方法,其一是用heapd.heappush()将值加入堆中,二是使用heapq.heapify(list)来实现

import heapq
'''
heapq.heappush(head,item)
    - Push the value item onto the heap,maintaining the heap invariant.
heapq.heappop(heap)
    - Pop and return the smallest item from the heap, maintaining the heap invariant.
    if the heap is empty,IndexError is raised.To access the smallest item withouut popping it 
'''
nums = [2,3,5,1,54,23,132]
heap = []
for num in nums:
    heapq.heappush(heap,num)#加入值
print(heap[0])#获取最小值

print([heapq.heappop(heap) for _ in range(len(nums))])#打印排序结果
# out:[1,2,3,5,23,54,132]

# 第二种
nums = [2,3,5,1,54,23,132]
heapq.heapify(nums)
print([heap.heappop(heap) for _ in range(len(nums))])
# out:[1,2,3,5,23,54,132]
合并堆

heapq 中还有heapq.merge(*iterables)方法,用于合并多个 排序后的序列形成一个排序后的序列,返回排序后的值的迭代器

'''
函数定义:
heapq.merge(*iterables)
    - Merge multiple sorted inputs into a single sorted output(for example, merge timestamped,entries from mutiple log files).Return an itreator over the sorted values.
    - Similar to sorted
'''
import heapq

num1 = [32, 3, 5, 34, 54, 23, 132]
num2 = [23, 2, 12, 656, 324, 23, 54]
num1 = sorted(num1)
num2 = sorted(num2)

res = heapq.merge(num1,num2)
print(list(res))
访问堆

利用heapq.heappop()弹出最小值

import heapq
nums = [2, 43, 45, 23, 12]
heapq.heapify(nums)
print(heapq.heappop(nums))#out: 2

res = [heapq.heappop(nums) for _ in range(len(nums))]
print(res)

如果需要删除堆中最小元素并且加入一元素,可以使用heapq.heapreplace()函数

import heapq

nums = [1,2,4,5,3]
heapq.heapify(nums)

heapq.heapreplace(nums,23)
print([heapq.heappop(nums) for _ in range(len(nums))])
#out:[2,3,4,5,23]
获取最小堆或最大堆

如果需要获取堆中的最大或者最小的范围值,则可以使用heapq.nlargest()或heapq.nsmallest()函数

'''
heapq.nlargest(n, iterable[, key])
    - Return a list with the n largest elements from the dataset defined by iterable. 
    - key if provided, specifies a function of one argument that is used to extract a comparison key from each element in the iterable: key=str.lower
    - Equivalent to: sorted(iterable, key=key, reverse=True)[:n]
'''
import heapq
nums = [1,2,3,4,5]
print(heapq.nlargest(3,nums))
print(heapq.nsmallest(3,nums))
#out:[3,4,5]
#out:[1,2,3]

这两个函数还接收key参数,用于dict或其他数据结构使用

import heapq
from pprint import pprint
portfolio = [
    {'name': 'IBM', 'shares': 100, 'price': 91.1},
    {'name': 'AAPL', 'shares': 50, 'price': 543.22},
    {'name': 'FB', 'shares': 200, 'price': 21.09},
    {'name': 'HPQ', 'shares': 35, 'price': 31.75},
    {'name': 'YHOO', 'shares': 45, 'price': 16.35},
    {'name': 'ACME', 'shares': 75, 'price': 115.65}
]
cheap = heapq.nsmallest(3, portfolio, key=lambda s: s['price'])
expensive = heapq.nlargest(3, portfolio, key=lambda s: s['price'])
print(cheap)
print(expensive)

"""
输出:
[{'name': 'YHOO', 'price': 16.35, 'shares': 45},
 {'name': 'FB', 'price': 21.09, 'shares': 200},
 {'name': 'HPQ', 'price': 31.75, 'shares': 35}]
[{'name': 'AAPL', 'price': 543.22, 'shares': 50},
 {'name': 'ACME', 'price': 115.65, 'shares': 75},
 {'name': 'IBM', 'price': 91.1, 'shares': 100}]
"""
posted on 2020-03-26 20:04  吕店老板  阅读(443)  评论(0编辑  收藏  举报