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函数嵌套实例
Sep 23 Python
Python检测QQ在线状态的方法
May 09 Python
Python中使用不同编码读写txt文件详解
May 28 Python
Python各类图像库的图片读写方式总结(推荐)
Feb 23 Python
怎么使用pipenv管理你的python项目
Mar 12 Python
Pipenv一键搭建python虚拟环境的方法
May 22 Python
Python字典创建 遍历 添加等实用基础操作技巧
Sep 13 Python
解决安装pycharm后不能执行python脚本的问题
Jan 19 Python
Python中如何将一个类方法变为多个方法
Dec 30 Python
django 解决model中类写不到数据库中,数据库无此字段的问题
May 20 Python
Django 如何使用日期时间选择器规范用户的时间输入示例代码详解
May 22 Python
python list的index()和find()的实现
Nov 16 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
用header 发送cookie的php代码
2007/03/16 PHP
php设置编码格式的方法
2013/03/05 PHP
php实现三级级联下拉框
2016/04/17 PHP
JavaScript入门教程 Cookies
2009/01/31 Javascript
jquery BS,dialog控件自适应大小
2009/07/06 Javascript
Google Map Api和GOOGLE Search Api整合实现代码
2009/07/18 Javascript
javascript针对DOM的应用分析(三)
2012/04/15 Javascript
用nodejs实现PHP的print_r函数代码
2014/03/14 NodeJs
javascript面向对象之this关键词用法分析
2015/01/13 Javascript
JS简单判断滚动条的滚动方向实现方法
2017/04/28 Javascript
React-Native使用Mobx实现购物车功能
2017/09/14 Javascript
JS简单实现点击跳转登陆邮箱功能的方法
2017/10/31 Javascript
Angular5中调用第三方库及jQuery的添加的方法
2018/06/07 jQuery
微信小程序云开发(数据库)详解
2019/05/17 Javascript
layui+jquery支持IE8的表格分页方法
2019/09/28 jQuery
vue项目中使用多选框的实例代码
2020/07/22 Javascript
[01:56]生活中的妖精之七夕特别档
2016/08/09 DOTA
跟老齐学Python之Python安装
2014/09/12 Python
Python 调用 zabbix api的方法示例
2019/01/06 Python
python开头的coding设置方法
2019/08/08 Python
python生成器推导式用法简单示例
2019/10/08 Python
python 使用paramiko模块进行封装,远程操作linux主机的示例代码
2020/12/03 Python
老海军美国官网:Old Navy
2016/09/05 全球购物
Original Penguin英国官方网站:美国著名休闲时装品牌
2016/10/30 全球购物
Clearly澳大利亚:购买眼镜、太阳镜和隐形眼镜
2018/04/26 全球购物
节能减排倡议书
2014/04/15 职场文书
公司贷款承诺书
2014/05/30 职场文书
授权委托书公证
2014/09/14 职场文书
暂住证明怎么写
2015/06/19 职场文书
元宵节晚会主持词
2015/07/01 职场文书
2016年法制宣传月活动总结
2016/04/01 职场文书
解决numpy和torch数据类型转化的问题
2021/05/23 Python
OpenCV-Python 实现两张图片自动拼接成全景图
2021/06/11 Python
详解Python函数print用法
2021/06/18 Python
python_tkinter事件类型详情
2022/03/20 Python
SQL Server 中的事务介绍
2022/05/20 SQL Server