详解python之heapq模块及排序操作


Posted in Python onApril 04, 2019

说到排序,很多人可能第一想到的就是sorted,但是你可能不知道python中其实还有还就中方法哟,并且好多种场景下效率都会比sorted高。那么接下来我就依次来介绍我所知道的排序操作。

sorted(iterable, *, key=None, reverse=False)

list1=[1,6,4,3,9,5]
list2=['12','a6','4','c34','b9','5']

print(sorted(list1)) #[1, 3, 4, 5, 6, 9]
print(sorted(list2)) #['12', '4', '5', 'a6', 'b9', 'c34']
#总结上面两种排序:字符串排序根据元素首字符的ASCII比较进行排序,
#数字类型按照大小排序,数字不能混合排序

list3=[
 {'name':'jim','age':23,'price':500},
 {'name':'mase','age':23,'price':600},
 {'name':'tom','age':25,'price':2000},
 {'name':'alice','age':22,'price':300},
 {'name':'rose','age':21,'price':2400},
]

print(sorted(list3,key=lambda s:(s['age'],s['price'])))
#[{'name': 'rose', 'age': 21, 'price': 2400}, {'name': 'alice', 'age': 22, 'price': 300}, {'name': 'jim', 'age': 23, 'price': 500}, {'name': 'mase', 'age': 23, 'price': 600}, {'name': 'tom', 'age': 25, 'price': 2000}]

最后的reverse参数我就不作说明了,就是把结果进行倒序,可用作降序排列
介绍一种比lambda效率高的方式:
operator模块中的方法itemgetter
>>> itemgetter(1)('ABCDEFG')
'B'
>>> itemgetter(1,3,5)('ABCDEFG')
('B', 'D', 'F')
>>> itemgetter(slice(2,None))('ABCDEFG')
'CDEFG
运用到上述代码
print(sorted(list3,key=itemgetter('age','price'))) #结果同上但效率会比较高

接下来的排序操作涉及到一个非常重要的一种数据结构——堆,不过今天我主要介绍这个模块中的方法,具体什么是堆,及其还有一种数据结构——栈,有时间我会专门写一篇文章来介绍。

heapq(Python内置的模块)

__all__ = ['heappush', 'heappop', 'heapify', 'heapreplace', 'merge',
           'nlargest', 'nsmallest', 'heappushpop']

接下来我们一一介绍。

nlargest与nsmallest,通过字面意思可以看出方法大致的作用,接下来动手测验

nlargest(n, iterable, key=None)
nsmallest(n, iterable, key=None)
#n:查找个数 iterable:可迭代对象 key:同sorted

list1=[1,6,4,3,9,5]
list2=['12','a6','4','c34','b9','5']
list3=[
 {'name':'jim','age':23,'price':500},
 {'name':'mase','age':23,'price':600},
 {'name':'tom','age':25,'price':2000},
 {'name':'alice','age':22,'price':300},
 {'name':'rose','age':21,'price':2400},
]

from operator import itemgetter
import heapq

print(heapq.nlargest(len(list1),list1))
print(heapq.nlargest(len(list2),list2))
print(heapq.nlargest(len(list3),list3,key=itemgetter('age','price')))
#以上代码输出结果同sorted

print(heapq.nsmallest(len(list1),list1))
print(heapq.nsmallest(len(list2),list2))
print(heapq.nsmallest(len(list3),list3,key=itemgetter('age','price')))
#结果是降序
[1, 3, 4, 5, 6, 9]
['12', '4', '5', 'a6', 'b9', 'c34']
[{'name': 'rose', 'age': 21, 'price': 2400}, {'name': 'alice', 'age': 22, 'price': 300}, {'name': 'jim', 'age': 23, 'price': 500}, {'name': 'mase', 'age': 23, 'price': 600}, {'name': 'tom', 'age': 25, 'price': 2000}]

heappush,heappop,heapify,heapreplace,heappushpop

堆结构特点:heap[0]永远是最小的元素(利用此特性排序)

heapify:对序列进行堆排序,
heappush:在堆序列中添加值
heappop:删除最小值并返回
heappushpop:添加并删除堆中最小值且返回,添加之后删除
heapreplace:添加并删除队中最小值且返回,删除之后添加

nums=[54,23,64.,323,53,3,212,453,65]
heapify(nums)  #先进行堆排序
print(heappop(nums))  #3
print(heappush(nums,50))  #添加操作,返回None
print(heappushpop(nums,10))  #由于是添加后删除,所以返回10
print(heappop(nums))  #23
print(heapreplace(nums,10))  #和heappushpop,返回50
print(nums)  #[10, 53, 54, 65, 323, 64.0, 212, 453]

merge:合并多个序列

list1 = [1, 2, 3, 4, 5, 12]
set1 = {2, 3, 9, 23, 54}
s = list(merge(list1,set1))
print(s)  #[1, 2, 2, 3, 3, 4, 5, 9, 12, 54, 23]
#发现输出结果不仅进行了合并,还进行了排序,有意思哈,可是换个代码测验,你再看一下

list1 = [31, 2, 83, 24, 5, 12]
set1 = {2, 83, 9, 23, 54}
s = list(merge(list1,set1))
print(s)  #[2, 9, 31, 2, 83, 24, 5, 12, 83, 54, 23]
#你们肯定想这是什么鬼,一点都没有头绪,其实经过我的多次测验,还是有规律的,但是由于没有什么作用就不大篇幅说明了,喜欢刨根问题的小伙伴可以尝试自己思考一下。

小伙伴们有没有想我为何介绍这个模块,并且和排序放在一起呢,其实在很多时候我们需要找序列中的前几个最大值或者最小值,使用此模块中的方法是最好不过的了。

如果需要全部排序我们使用sorted,需要查找最大或最小的几个或者多个我们使用alargest/asmallest,查找最大最小使用max/min

Python 相关文章推荐
Python的Flask开发框架简单上手笔记
Nov 16 Python
分分钟入门python语言
Mar 20 Python
pandas如何处理缺失值
Jul 31 Python
Python常用模块sys,os,time,random功能与用法实例分析
Jan 07 Python
Django用数据库表反向生成models类知识点详解
Mar 25 Python
python dict乱码如何解决
Jun 07 Python
python3.4中清屏的处理方法
Jul 06 Python
python实现数字炸弹游戏程序
Jul 17 Python
Python 多线程C段扫描、检测 Ping扫描脚本的实现
Sep 03 Python
python定时截屏实现
Nov 02 Python
python日志通过不同的等级打印不同的颜色(示例代码)
Jan 13 Python
python使用pymysql模块操作MySQL
Jun 16 Python
python实现kmp算法的实例代码
Apr 03 #Python
详解python多线程之间的同步(一)
Apr 03 #Python
Python将列表数据写入文件(txt, csv,excel)
Apr 03 #Python
详解python读取image
Apr 03 #Python
Python小白必备的8个最常用的内置函数(推荐)
Apr 03 #Python
查看python安装路径及pip安装的包列表及路径
Apr 03 #Python
元组列表字典(莫烦python基础)
Apr 03 #Python
You might like
PHP session常见问题集锦及解决办法总结
2007/03/18 PHP
PHP实现根据浏览器跳转不同语言页面代码
2013/08/02 PHP
php使用glob函数快速查询指定目录文件的方法
2014/11/15 PHP
php字符串比较函数用法小结(strcmp,strcasecmp,strnatcmp及strnatcasecmp)
2016/07/18 PHP
JS 文件本身编码转换 图文教程
2009/10/12 Javascript
基于jquery的获取mouse坐标插件的实现代码
2010/04/01 Javascript
jQuery simplePage+AJAX plus分页插件用法实例
2016/02/17 Javascript
深入理解Javascript中的自执行匿名函数
2016/06/03 Javascript
微信小程序模板之分页滑动栏
2017/02/10 Javascript
浅谈Vue网络请求之interceptors实际应用
2018/02/28 Javascript
nuxt框架中路由鉴权之Koa和Session的用法
2018/05/09 Javascript
微信小程序WebSocket实现聊天对话功能
2018/07/06 Javascript
layui 监听select选择 获取当前select的ID名称方法
2019/09/24 Javascript
React 条件渲染最佳实践小结(7种)
2020/09/27 Javascript
使用python调用浏览器并打开一个网址的例子
2014/06/05 Python
解析Python中的生成器及其与迭代器的差异
2016/06/20 Python
python实现机器人行走效果
2018/01/29 Python
Python装饰器用法实例分析
2019/01/14 Python
学习和使用python的13个理由
2019/07/30 Python
Python 异步协程函数原理及实例详解
2019/11/13 Python
Pyinstaller加密打包应用的示例代码
2020/06/11 Python
python判断是空的实例分享
2020/07/06 Python
selenium框架中driver.close()和driver.quit()关闭浏览器
2020/12/08 Python
Html5如何唤起百度地图App的方法
2019/01/27 HTML / CSS
实例教程 HTML5 Canvas 超炫酷烟花绽放动画实现代码
2014/11/05 HTML / CSS
使用html5实现表格实现标题合并的实例代码
2019/05/13 HTML / CSS
新西兰最大的在线设计师眼镜店:SmartBuyGlasses新西兰
2017/10/20 全球购物
Luxplus丹麦:香水和个人护理折扣
2018/04/23 全球购物
英国购买威士忌网站:Master of Malt
2019/09/26 全球购物
师范生实习的个人自我鉴定
2013/10/20 职场文书
女娲补天教学反思
2014/02/05 职场文书
平安工地汇报材料
2014/08/19 职场文书
国庆节活动总结
2014/08/26 职场文书
2019幼儿教师求职信(3篇)
2019/09/20 职场文书
python 调用js的四种方式
2021/04/11 Python
Spring中bean集合注入的方法详解
2022/07/07 Java/Android