详解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概率计算器实例分析
Mar 25 Python
21行Python代码实现拼写检查器
Jan 25 Python
Python 类与元类的深度挖掘 II【经验】
May 06 Python
Python脚本实现Web漏洞扫描工具
Oct 25 Python
pygame加载中文名mp3文件出现error
Mar 31 Python
python实现闹钟定时播放音乐功能
Jan 25 Python
Python实现绘制双柱状图并显示数值功能示例
Jun 23 Python
pandas 根据列的值选取所有行的示例
Nov 07 Python
python与字符编码问题
May 24 Python
Django中ajax发送post请求 报403错误CSRF验证失败解决方案
Aug 13 Python
python 用户交互输入input的4种用法详解
Sep 24 Python
Python爬虫基础之简单说一下scrapy的框架结构
Jun 26 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
CentOS系统中PHP安装扩展的方式汇总
2017/04/09 PHP
php 将json格式数据转换成数组的方法
2018/08/21 PHP
js监听表单value的修改同步问题,跨浏览器支持
2009/12/31 Javascript
js实现的仿新浪微博完美的时间组件升级版
2011/12/20 Javascript
jquery ajax 同步异步的执行 return值不能取得的解决方案
2012/01/08 Javascript
jQuery.each()用法分享
2012/07/31 Javascript
iframe子页面获取父页面元素的方法
2013/11/05 Javascript
input链接页面、打开新网页等等的具体实现
2013/12/30 Javascript
js设置控件的隐藏与显示的两种方法
2014/08/21 Javascript
JavaScript使用shift方法移除素组第一个元素实例分析
2015/04/06 Javascript
jquery实现点击展开列表同时隐藏其他列表
2015/08/10 Javascript
JS基于正则表达式的替换操作(replace)用法示例
2017/04/28 Javascript
jquery动态赋值id与动态取id方法示例
2017/08/21 jQuery
vue实现计步器功能
2019/11/01 Javascript
vue在线动态切换主题色方案
2020/03/26 Javascript
微信小程序自定义yPicker组件实现省市区三级联动功能
2020/10/29 Javascript
探索node之事件循环的实现
2020/10/30 Javascript
Python群发邮件实例代码
2014/01/03 Python
Python中用PIL库批量给图片加上序号的教程
2015/05/06 Python
python实现的多线程端口扫描功能示例
2017/01/21 Python
Python爬虫将爬取的图片写入world文档的方法
2018/11/07 Python
Python常见数据结构之栈与队列用法示例
2019/01/14 Python
Python进度条的制作代码实例
2019/08/31 Python
Python bisect模块原理及常见实例
2020/06/17 Python
selenium判断元素是否存在的两种方法小结
2020/12/07 Python
盛大二次面试题
2016/11/18 面试题
编辑找工作求职信分享
2014/01/03 职场文书
副职竞争上岗演讲稿
2014/05/12 职场文书
反腐倡廉演讲稿
2014/05/22 职场文书
学生安全承诺书
2014/05/22 职场文书
全陪导游词
2015/02/04 职场文书
新农村建设指导员工作总结
2015/08/13 职场文书
python实战之90行代码写个猜数字游戏
2021/04/22 Python
LayUI+Shiro实现动态菜单并记住菜单收展的示例
2021/05/06 Javascript
超级详细实用的pycharm常用快捷键
2021/05/12 Python
如何使用PostgreSQL进行中文全文检索
2021/05/27 PostgreSQL