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 文件管理实例详解
Nov 10 Python
对python中使用requests模块参数编码的不同处理方法
May 18 Python
python实现随机梯度下降法
Mar 24 Python
一看就懂得Python的math模块
Oct 21 Python
Python设计模式之抽象工厂模式原理与用法详解
Jan 15 Python
python实现飞行棋游戏
Feb 05 Python
python GUI库图形界面开发之PyQt5控件QTableWidget详细使用方法与属性
Feb 25 Python
python如何使用代码运行助手
Jul 03 Python
解决Ubuntu18中的pycharm不能调用tensorflow-gpu的问题
Sep 17 Python
python 解决函数返回return的问题
Dec 05 Python
Python文件的操作示例的详细讲解
Apr 08 Python
Python趣味挑战之实现简易版音乐播放器
May 28 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
WINDOWS下php5.2.4+mysql6.0+apache2.2.4+ZendOptimizer-3.3.0配置
2008/03/28 PHP
php学习之数据类型之间的转换代码
2011/05/29 PHP
php操作MongoDB基础教程(连接、新增、修改、删除、查询)
2014/03/25 PHP
php将html转成wml的WAP标记语言实例
2015/07/08 PHP
详解json在php中的应用
2018/09/30 PHP
PHP连接MySQL数据库三种实现方法
2020/12/10 PHP
在b/s开发中经常用到的javaScript技术
2006/08/23 Javascript
写了一个layout,拖动条连贯,内容区可为iframe
2007/08/19 Javascript
jQuery 获取对象 基本选择与层级
2010/05/31 Javascript
node.js 开发指南 ? Node.js 连接 MySQL 并进行数据库操作
2014/07/29 Javascript
Angular中$compile源码分析
2016/01/28 Javascript
全面详细的jQuery常见开发技巧手册
2016/02/21 Javascript
微信小程序 JS动态修改样式的实现代码
2017/02/10 Javascript
JavaScript中三种常见的排序方法
2017/02/24 Javascript
详解webpack import()动态加载模块踩坑
2018/07/17 Javascript
jquery简单实现纵向的无缝滚动代码实例
2019/04/01 jQuery
微信小程序结合Storage实现搜索历史效果
2019/05/18 Javascript
详解Vue-cli3.X使用px2rem遇到的问题
2019/08/09 Javascript
微信小程序 函数防抖 解决重复点击消耗性能问题实现代码
2019/09/12 Javascript
微信小程序实现吸顶特效
2020/01/08 Javascript
NodeJS多种创建WebSocket监听的方式(三种)
2020/06/04 NodeJs
vscode 插件开发 + vue的操作方法
2020/06/05 Javascript
Python 序列化 pickle/cPickle模块使用介绍
2014/11/30 Python
在Python中使用next()方法操作文件的教程
2015/05/24 Python
python MysqlDb模块安装及其使用详解
2018/02/23 Python
selenium+python自动化测试之页面元素定位
2019/01/23 Python
python tkinter组件摆放方式详解
2019/09/16 Python
html5拍照功能实现代码(htm5上传文件)
2013/12/11 HTML / CSS
深入浅析HTML5中的SVG
2015/11/27 HTML / CSS
日本快乐生活方式购物网站:Shop Japan
2018/07/17 全球购物
酒吧员工的岗位职责
2013/11/26 职场文书
模范教师事迹材料
2014/02/10 职场文书
捐款倡议书怎么写
2014/05/13 职场文书
写给医生的感谢信
2015/01/22 职场文书
导游词之沈阳清昭陵
2019/12/28 职场文书
pycharm部署django项目到云服务器的详细流程
2021/06/29 Python