详解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 相关文章推荐
教你如何将 Sublime 3 打造成 Python/Django IDE开发利器
Jul 04 Python
python中引用与复制用法实例分析
Jun 04 Python
Python读取网页内容的方法
Jul 30 Python
Python求算数平方根和约数的方法汇总
Mar 09 Python
Python自定义类的数组排序实现代码
Aug 28 Python
基于Django contrib Comments 评论模块(详解)
Dec 08 Python
Python3 串口接收与发送16进制数据包的实例
Jun 12 Python
使用django实现一个代码发布系统
Jul 18 Python
Django ORM 自定义 char 类型字段解析
Aug 09 Python
Pycharm中切换pytorch的环境和配置的教程详解
Mar 13 Python
python实现xlwt xlrd 指定条件给excel行添加颜色
Jul 14 Python
浅谈pytorch中的dropout的概率p
May 27 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多线程抓取网页实现代码
2010/07/22 PHP
PHP测试程序运行时间的类
2012/02/05 PHP
php使用PDO下exec()函数查询执行后受影响行数的方法
2017/03/28 PHP
PHP实现通过strace定位故障原因的方法
2018/04/29 PHP
实例讲解PHP表单验证功能
2019/02/15 PHP
jQuery Ajax之$.get()方法和$.post()方法
2009/10/12 Javascript
jquery星级插件、支持页面中多次使用
2012/03/25 Javascript
jQuery动态添加、删除元素的方法
2014/01/09 Javascript
详解Bootstrap创建表单的三种格式(一)
2016/01/04 Javascript
jQuery调用Webservice传递json数组的方法
2016/08/06 Javascript
JS实现页面数据无限加载
2016/09/13 Javascript
js print打印网页指定区域内容的简单实例
2016/11/01 Javascript
JS获得多个同name 的input输入框的值的实现方法
2017/01/09 Javascript
jQuery插件zTree实现单独选中根节点中第一个节点示例
2017/03/08 Javascript
AngularJS之自定义服务详解(factory、service、provider)
2017/04/14 Javascript
react.js组件实现拖拽复制和可排序的示例代码
2018/08/20 Javascript
ES6中的迭代器、Generator函数及Generator函数的异步操作方法
2019/05/12 Javascript
JS中getElementsByClassName与classList兼容性问题解决方案分析
2019/08/07 Javascript
Vue实现购物车详情页面的方法
2019/08/20 Javascript
layui点击左侧导航栏,实现不刷新整个页面,只刷新局部的方法
2019/09/25 Javascript
JavaScript array常用方法代码实例详解
2020/09/02 Javascript
Node.js文本文件BOM头的去除方法
2020/11/22 Javascript
vue-router定义元信息meta操作
2020/12/07 Vue.js
jupyter notebook更换皮肤主题的实现
2021/01/07 Python
Python与C/C++的相互调用案例
2021/03/04 Python
Giuseppe Zanotti美国官方网站:将鞋履视为高级时装般精心制作
2018/02/06 全球购物
夏威夷咖啡公司:Hawaii Coffee Company
2019/09/19 全球购物
八年级英语教学反思
2014/01/09 职场文书
宗教学大学生职业生涯规划范文
2014/02/08 职场文书
乡镇办公室工作决心书
2014/03/11 职场文书
机关驾驶员违规检讨书
2014/09/13 职场文书
奖学金感谢信
2015/01/21 职场文书
晚会开场白和结束语
2015/05/29 职场文书
观后感开头
2015/06/19 职场文书
2016年第32个教师节致辞
2015/11/26 职场文书
解决MySQL报“too many connections“错误
2022/04/19 MySQL