Python常用数据结构之heapq模块建议收藏

heapq堆是一种特殊的树形结构,通常我们所说的堆的数据结构指的是完全二叉树,并且根节点的值小于等于该节点所有子节点的值常用方法常用方法示例>>>[15,2,50,3

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

全栈程序员社区此处内容已经被作者隐藏,请输入验证码查看内容
验证码:
请关注本站微信公众号,回复“验证码”,获取验证码。在微信里搜索“全栈程序员社区”或者“www_javaforall_cn”或者微信扫描右侧二维码都可以关注本站微信公众号。

Python数据结构常用模块:collections、heapq、operator、itertools

heapq

  堆是一种特殊的树形结构,通常我们所说的堆的数据结构指的是完全二叉树,并且根节点的值小于等于该节点所有子节点的值

                                                       Python常用数据结构之heapq模块建议收藏

常用方法

heappush(heap,item) 往堆中插入一条新的值
heappop(heap) 从堆中弹出最小值
heapreplace(heap,item) 从堆中弹出最小值,并往堆中插入item
heappushpop(heap,item) Python3中的heappushpop更高级
heapify(x) 以线性时间将一个列表转化为堆
merge(*iterables,key=None,reverse=False) 合并对个堆,然后输出
nlargest(n,iterable,key=None) 返回可枚举对象中的n个最大值并返回一个结果集list
nsmallest(n,iterable,key=None) 返回可枚举对象中的n个最小值并返回一个结果集list

常用方法示例 

#coding=utf-8

import heapq
import random

def test():
    li = list(random.sample(range(100),6))
    print (li)

    n = len(li)
    #nlargest
    print ("nlargest:",heapq.nlargest(n, li))
    #nsmallest
    print ("nsmallest:", heapq.nsmallest(n, li)) 
    #heapify
    print('original list is', li) 
    heapq.heapify(li) 
    print('heapify  list is', li)  
    # heappush & heappop  
    heapq.heappush(li, 105)  
    print('pushed heap is', li)  
    heapq.heappop(li)  
    print('popped heap is', li)  
    # heappushpop & heapreplace  
    heapq.heappushpop(li, 130)    # heappush -> heappop  
    print('heappushpop', li)  
    heapq.heapreplace(li, 2)    # heappop -> heappush  
    print('heapreplace', li) 

  >>> [15, 2, 50, 34, 37, 55]
  >>> nlargest: [55, 50, 37, 34, 15, 2]
  >>> nsmallest: [2, 15, 34, 37, 50, 55]
  >>> original list is [15, 2, 50, 34, 37, 55]
  >>> heapify  list is [2, 15, 50, 34, 37, 55]
  >>> pushed heap is [2, 15, 50, 34, 37, 55, 105]
  >>> popped heap is [15, 34, 50, 105, 37, 55]
  >>> heappushpop [34, 37, 50, 105, 130, 55]
  >>> heapreplace [2, 37, 50, 105, 130, 55]

堆排序示例 

  heapq模块中有几张方法进行排序:

  方法一:

#coding=utf-8

import heapq

def heapsort(iterable):
    heap = []
    for i in iterable:
        heapq.heappush(heap, i)

    return [heapq.heappop(heap) for j in range(len(heap))]
        
if __name__ == "__main__":
    li = [30,40,60,10,20,50]
    print(heapsort(li))

  >>>> [10, 20, 30, 40, 50, 60]

  方法二(使用nlargest或nsmallest):

li = [30,40,60,10,20,50]
#nlargest
n = len(li)
print ("nlargest:",heapq.nlargest(n, li))
#nsmallest
print ("nsmallest:", heapq.nsmallest(n, li))

  >>> nlargest: [60, 50, 40, 30, 20, 10]
  >>> nsmallest: [10, 20, 30, 40, 50, 60]

  方法三(使用heapify):

def heapsort(list):
    heapq.heapify(list)
    heap = []

    while(list):
        heap.append(heapq.heappop(list))
        
    li[:] = heap
    print (li)
        
if __name__ == "__main__":
    li = [30,40,60,10,20,50]
    heapsort(li)

  >>> [10, 20, 30, 40, 50, 60]

堆在优先级队列中的应用

  需求:实现任务的添加,删除(相当于任务的执行),修改任务优先级

pq = []                         # list of entries arranged in a heap
entry_finder = {}               # mapping of tasks to entries
REMOVED = '<removed-task>'      # placeholder for a removed task
counter = itertools.count()     # unique sequence count

def add_task(task, priority=0):
    'Add a new task or update the priority of an existing task'
    if task in entry_finder:
        remove_task(task)
    count = next(counter)
    entry = [priority, count, task]
    entry_finder[task] = entry
    heappush(pq, entry)

def remove_task(task):
    'Mark an existing task as REMOVED.  Raise KeyError if not found.'
    entry = entry_finder.pop(task)
    entry[-1] = REMOVED

def pop_task():
    'Remove and return the lowest priority task. Raise KeyError if empty.'
    while pq:
        priority, count, task = heappop(pq)
        if task is not REMOVED:
            del entry_finder[task]
            return task
    raise KeyError('pop from an empty priority queue')

 

  

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/120201.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 如何建立爬虫代理ip池「建议收藏」

    如何建立爬虫代理ip池「建议收藏」目录一、为什么需要建立爬虫代理ip池二、如何建立一个爬虫代理ip池原文地址:https://www.cnblogs.com/TurboWay/p/8172246.html一、为什么需要建立爬虫代理ip池在众多的网站防爬措施中,有一种是根据ip的访问频率进行限制的,在某段时间内,当某个ip的访问量达到一定的阀值时,该ip会被拉黑、在一段时…

    2022年5月15日
  • Http请求URL长度限制[通俗易懂]

    Http请求URL长度限制[通俗易懂]http1.1协议原文http1.1协议中对url的长度是不受限制的,协议原文://https://www.ietf.org/rfc/rfc2616.txt3.2.1GeneralSyntax TheHTTPprotocoldoesnotplaceanyapriorilimitonthelengthofaURI.ServersM…

    2022年8月24日
  • 抖音挺火的机房蹦迪代码「建议收藏」

    最近抖音乃至全网这个机房蹦迪代码很火今天分享下代码.桌面新建一个文档文件,后缀名改为bat,然后右击该文件点击编辑,输入下方代码保存双击运行即可!colorecho开始蹦迪color1aecho开始蹦迪color2becho开始蹦迪color3cecho开始蹦迪color4decho开始蹦迪color…

    2022年4月14日
  • 计算机桌面锁写快捷,锁定计算机快捷键_锁定计算机的快捷键

    计算机桌面锁写快捷,锁定计算机快捷键_锁定计算机的快捷键2017-01-0515:11:14当有事需暂时离开,又不想他人动用电脑时,可采取锁定桌面的办法。1、首先要在电脑中设置好一个用户帐户密码(开机密码)。在锁定桌面时,只需按Win十L键(即按住那个有微软视窗图标的键…2016-12-1814:43:081在电脑上键盘上找到Windows键和L键,这两个键就是快速锁定计算机的关键所在步骤阅读2两只手一只手按Windows键,另一只手按L键,…

    2022年7月21日
  • python输出unicode编码_Python以utf8编码读取文件

    python输出unicode编码_Python以utf8编码读取文件withopen(self.path,’r’)astest:forlineintest:pass代码如上,出现错误:UnicodeDecodeError:’gbk’codeccan’tdecodebyte0x80inposition…UnicodeDecodeError:’gbk’codeccan’tdecodebyte0x80inposition9:…或者是UnicodeDecodeErr..

    2022年9月13日
  • CDMA、CDMA2000、WCDMA、TD-SCDMA的区别

    CDMA、CDMA2000、WCDMA、TD-SCDMA的区别前几日,笔者有一位朋友从网上买了一部二手的苹果iPhone4S,拿到手之后才发现,这部iPhone4S原来是电信版的,而自己用的SIM卡是中国移动的,根本没办法使用,非常的沮丧,这也怪当初购买时没有注意不同运营商之间网络不兼容的问题。其实在生活中,很多人对于手机网络方面的知识知之甚少,今天笔者就为大家介绍一下手机网络方面的一些常识,以免再次发生以上不必要的错误。GSM知多少?  说到GSM,相

    2022年9月27日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号