详解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中编写ORM框架的入门指引
Apr 29 Python
python django 增删改查操作 数据库Mysql
Jul 27 Python
Python引用类型和值类型的区别与使用解析
Oct 17 Python
利用python将图片转换成excel文档格式
Dec 30 Python
Tornado高并发处理方法实例代码
Jan 15 Python
python 读文件,然后转化为矩阵的实例
Apr 23 Python
Python读取stdin方法实例
May 24 Python
Python:Numpy 求平均向量的实例
Jun 29 Python
Pycharm配置PyQt5环境的教程
Apr 02 Python
Python生成并下载文件后端代码实例
Aug 31 Python
详解Flask开发技巧之异常处理
Jun 15 Python
PyTorch中的torch.cat简单介绍
Mar 17 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
adodb与adodb_lite之比较
2006/12/31 PHP
php 调试利器debug_print_backtrace()
2012/07/23 PHP
PHP正则匹配操作简单示例【preg_match_all应用】
2017/07/10 PHP
Prototype使用指南之dom.js
2007/01/10 Javascript
Whatever:hover 无需javascript让IE支持丰富伪类
2010/06/29 Javascript
JQuery 文本框回车跳到下一个文本框示例代码
2013/08/30 Javascript
如何判断元素是否为HTMLElement元素
2013/12/06 Javascript
javascript中文本框中输入法切换的问题
2013/12/10 Javascript
js中typeof的用法汇总
2013/12/12 Javascript
window.showModalDialog()返回值的学习心得总结
2014/01/07 Javascript
关于jQuery判断元素是否存在的问题示例探讨
2014/07/21 Javascript
如何编写高质量JS代码(续)
2015/02/25 Javascript
BootstrapValidator不触发校验的实现代码
2016/09/28 Javascript
jQuery焦点图轮播效果实现方法
2016/12/19 Javascript
JS实现仿百度文库评分功能
2017/01/12 Javascript
js 博客内容进度插件详解
2017/02/19 Javascript
浅谈js中的this问题
2017/08/31 Javascript
详解vue 组件之间使用eventbus传值
2017/10/25 Javascript
django项目运行因中文而乱码报错的几种情况解决
2017/11/07 Python
python numpy和list查询其中某个数的个数及定位方法
2018/06/27 Python
Python实现正整数分解质因数操作示例
2018/08/01 Python
基于python使用tibco ems代码实例
2019/12/20 Python
对Python中 \r, \n, \r\n的彻底理解
2020/03/06 Python
python3爬虫中异步协程的用法
2020/07/10 Python
Python之字典对象的几种创建方法
2020/09/30 Python
python如何修改文件时间属性
2021/02/05 Python
python反扒机制的5种解决方法
2021/02/06 Python
css3弹性盒模型实例介绍
2013/05/27 HTML / CSS
介绍一下JMS编程步骤
2015/09/22 面试题
一百多行代码实现react拖拽hooks
2021/03/23 Javascript
工程建设实施方案
2014/03/14 职场文书
学历公证书范本
2014/04/09 职场文书
中学生操行评语大全
2014/04/24 职场文书
道德演讲稿
2014/05/21 职场文书
2015年人力资源工作总结
2015/04/08 职场文书
心术观后感
2015/06/11 职场文书