Python cookbook(数据结构与算法)找到最大或最小的N个元素实现方法示例


Posted in Python onFebruary 13, 2018

本文实例讲述了python找到最大或最小的N个元素实现方法。分享给大家供大家参考,具体如下:

问题:想在某个集合中找出最大或最小的N个元素

解决方案:heapq模块中的nlargest()nsmallest()两个函数正是我们需要的。

>>> import heapq
>>> nums=[1,8,2,23,7,-4,18,23,42,37,2]
>>> print(heapq.nlargest(3,nums))
[42, 37, 23]
>>> print(heapq.nsmallest(3,nums))
[-4, 1, 2]
>>>

这两个函数接受一个参数key,允许其工作在更复杂的数据结构之上:

# example.py
#
# Example of using heapq to find the N smallest or largest items
import heapq
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)
Python 3.4.0 (v3.4.0:04f714765c13, Mar 16 2014, 19:24:06) [MSC v.1600 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> ================================ RESTART ================================
>>>
[{'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}]
>>>

如果正在寻找的最大或最小的N个元素,且相比于集合中元素的数量,N很小时,下面的函数性能更好。

这些函数首先会在底层将数据转化为列表,且元素会以堆的顺序排列。

>>> import heapq
>>> nums=[1,8,2,23,7,-4,18,23,42,37,2]
>>> heap=list(nums)
>>> heap
[1, 8, 2, 23, 7, -4, 18, 23, 42, 37, 2]
>>> heapq.heapify(heap) #heapify()参数必须是list,此函数将list变成堆,实时操作。从而能够在任何情况下使用堆的函数。
>>> heap
[-4, 2, 1, 23, 7, 2, 18, 23, 42, 37, 8]
>>> heapq.heappop(heap)#如下是为了找到第3小的元素
-4
>>> heapq.heappop(heap)
1
>>> heapq.heappop(heap)
2
>>>

堆(heap)最重要的特性就是heap[0]总是最小的元素。可通过heapq.heappop()轻松找到最小值,这个操作的复杂度为O(logN),N代表堆得大小。

总结:

1、当要找的元素数量相对较小时,函数nlargest()nsmallest()才最适用。
2、若只是想找到最小和最大值(N=1)时,使用min()和max()会更快。
3、若N和集合本身的大小差不多,更快的方法是先对集合排序再进行切片操作(例如使用sorted(items)[:N]sorted(items)[-N:]
4、heapq.heappush(heap, item):将item压入到堆数组heap中。如果不进行此步操作,后面的heappop()失效;
heapq.heappop(heap):从堆数组heap中取出最小的值,并返回。
heapq.heapify(list):参数必须是list,此函数将list变成堆,实时操作。从而能够在任何情况下使用堆的函数。
heapq.heappushpop(heap, item):是上述heappush和heappop的合体,同时完成两者的功能.注意:相当于先操作了heappush(heap,item),然后操作heappop(heap)
heapreplace(heap, item):是heappop(heap)和heappush(heap,item)的联合操作。注意,与heappushpop(heap,item)的区别在于,顺序不同,这里是先进行删除,后压入堆
heap,merge(*iterables)

>>> h=[]   #定义一个list
>>> from heapq import * #引入heapq模块
>>> h
[]
>>> heappush(h,5)  #向堆中依次增加数值
>>> heappush(h,2)
>>> heappush(h,3)
>>> heappush(h,9)
>>> h    #h的值
[2, 5, 3, 9]
>>> heappop(h)   #从h中删除最小的,并返回该值
2
>>> h
[3, 5, 9]
>>> h.append(1)   #注意,如果不是压入堆中,而是通过append追加一个数值
>>> h    #堆的函数并不能操作这个增加的数值,或者说它堆对来讲是不存在的
[3, 5, 9, 1]
>>> heappop(h)   #从h中能够找到的最小值是3,而不是1
3
>>> heappush(h,2)  #这时,不仅将2压入到堆内,而且1也进入了堆。
>>> h
[1, 2, 9, 5]
>>> heappop(h)   #操作对象已经包含了1
1
>>> h
[1, 2, 9, 5]
>>> heappop(h)
1
>>> heappushpop(h,4)  #增加4同时删除最小值2并返回该最小值,与下列操作等同:
2    #heappush(h,4),heappop(h)
>>> h
[4, 5, 9]
>>> a=[3,6,1]
>>> heapify(a)   #将a变成堆之后,可以对其操作
>>> heappop(a)
1
>>> b=[4,2,5]   #b不是堆,如果对其进行操作,显示结果如下
>>> heappop(b)   #按照顺序,删除第一个数值并返回,不会从中挑选出最小的
4
>>> heapify(b)   #变成堆之后,再操作
>>> heappop(b)
2
>>> a=[]
>>> heapreplace(a,3)  #如果list空,则报错
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: index out of range
>>> heappush(a,3)
>>> a
[3]
>>> heapreplace(a,2)  #先执行删除(heappop(a)->3),再执行加入(heappush(a,2))
3
>>> a
[2]
>>> heappush(a,5)
>>> heappush(a,9)
>>> heappush(a,4)
>>> a
[2, 4, 9, 5]
>>> heapreplace(a,6)  #先从堆a中找出最小值并返回,然后加入6
2
>>> a
[4, 5, 9, 6]
>>> heapreplace(a,1)  #1是后来加入的,在1加入之前,a中的最小值是4
4
>>> a
[1, 5, 9, 6]
>>> a=[2,4,6]
>>> b=[1,3,5]
>>> c=merge(a,b)
>>> list(c)
[1, 2, 3, 4, 5, 6]

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python获取apk文件URL地址实例
Nov 01 Python
Python实现将目录中TXT合并成一个大TXT文件的方法
Jul 15 Python
Python实现二维有序数组查找的方法
Apr 27 Python
Python实现对字符串的加密解密方法示例
Apr 29 Python
教你用Python写安卓游戏外挂
Jan 11 Python
python3实现windows下同名进程监控
Jun 21 Python
深入浅析Python2.x和3.x版本的主要区别
Nov 30 Python
python 实现语音聊天机器人的示例代码
Dec 02 Python
在pycharm下设置自己的个性模版方法
Jul 15 Python
使用OpenCV实现道路车辆计数的使用方法
Jul 15 Python
python实现视频压缩功能
Dec 18 Python
教你使用Pandas直接核算Excel中快递费用
May 12 Python
python3学习笔记之多进程分布式小例子
Feb 13 #Python
Python cookbook(数据结构与算法)保存最后N个元素的方法
Feb 13 #Python
Python cookbook(数据结构与算法)从任意长度的可迭代对象中分解元素操作示例
Feb 13 #Python
Python cookbook(数据结构与算法)将序列分解为单独变量的方法
Feb 13 #Python
Python内置模块ConfigParser实现配置读写功能的方法
Feb 12 #Python
Python内置模块hashlib、hmac与uuid用法分析
Feb 12 #Python
20个常用Python运维库和模块
Feb 12 #Python
You might like
php中jpgraph类库的使用介绍
2013/08/08 PHP
php中的常用魔术方法汇总
2016/02/14 PHP
thinkphp项目如何自定义微信分享描述内容
2017/02/20 PHP
TNC vs BOOM BO3 第一场2.13
2021/03/10 DOTA
多广告投放代码 推荐
2006/11/13 Javascript
在JavaScript中遭遇级联表达式陷阱
2007/03/08 Javascript
IE浏览器兼容Firefox的JS脚本的代码
2008/10/23 Javascript
Prototype使用指南之selector.js说明
2008/10/26 Javascript
Jquery获取元素的父容器对象示例代码
2014/02/10 Javascript
jQuery中live()方法用法实例
2015/01/19 Javascript
jquery 构造函数在表单提交过程中修改数据
2015/05/25 Javascript
喜大普奔!jQuery发布 3.0 最终版
2016/06/12 Javascript
Bootstrap中的表单验证插件bootstrapValidator使用方法整理(推荐)
2016/06/21 Javascript
angularJS 指令封装回到顶部示例详解
2017/01/22 Javascript
JavaScript数组_动力节点Java学院整理
2017/06/26 Javascript
2种简单的js倒计时方式
2017/10/20 Javascript
基于Vue的移动端图片裁剪组件功能
2017/11/28 Javascript
详解Vue的异步更新实现原理
2020/12/22 Vue.js
[02:42]岂曰无衣,与子同袍!DOTA2致敬每一位守护人
2020/02/17 DOTA
[08:06]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant 选手采访
2021/03/11 DOTA
Python闭包的两个注意事项(推荐)
2017/03/20 Python
windows下pycharm安装、创建文件、配置默认模板
2018/07/31 Python
解决python中画图时x,y轴名称出现中文乱码的问题
2019/01/29 Python
pandas删除行删除列增加行增加列的实现
2019/07/06 Python
CSS3制作文字半透明倒影效果的两种实现方式
2014/08/08 HTML / CSS
YSL圣罗兰美妆美国官网:Yves Saint Lauret US
2016/11/21 全球购物
viagogo英国票务平台:演唱会、体育比赛、戏剧门票
2017/03/24 全球购物
澳大利亚在线百货商店:Real Smart
2017/08/13 全球购物
Casetify官网:自制专属手机壳、iPad护壳和Apple Watch手表带
2018/05/09 全球购物
教师教学评估方案
2014/05/09 职场文书
美国留学经济担保书
2014/05/20 职场文书
文明寝室标语
2014/06/13 职场文书
2014年助理工程师工作总结
2014/11/14 职场文书
2015年销售员工作总结范文
2015/04/07 职场文书
合理缓解职场压力,让你随时保持最佳状态!
2019/06/21 职场文书
Java反应式框架Reactor中的Mono和Flux
2021/07/25 Java/Android