详解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探索之修改Python搜索路径
Oct 25 Python
Django视图之ORM数据库查询操作API的实例
Oct 27 Python
python利用rsa库做公钥解密的方法教程
Dec 10 Python
python实现闹钟定时播放音乐功能
Jan 25 Python
Python OpenCV 直方图的计算与显示的方法示例
Feb 08 Python
python tensorflow学习之识别单张图片的实现的示例
Feb 09 Python
对python3 中方法各种参数和返回值详解
Dec 15 Python
tensorflow如何批量读取图片
Aug 29 Python
python 浅谈serial与stm32通信的编码问题
Dec 18 Python
keras实现调用自己训练的模型,并去掉全连接层
Jun 09 Python
python3爬虫中引用Queue的实例讲解
Nov 24 Python
Python基础之元类详解
Apr 29 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实现MVC开发得最简单的方法――模型
2007/04/10 PHP
php读取mysql乱码,用set names XXX解决的原理分享
2011/12/29 PHP
WampServer搭建php环境时遇到的问题汇总
2015/07/23 PHP
PHP Imagick完美实现图片裁切、生成缩略图、添加水印
2016/02/22 PHP
php+ajax实现仿百度查询下拉内容功能示例
2017/10/20 PHP
不常用但很实用的PHP预定义变量分析
2019/06/25 PHP
dreamweaver 安装Jquery智能提示
2011/04/02 Javascript
jQuery学习笔记 获取jQuery对象
2012/09/19 Javascript
Js数组的操作push,pop,shift,unshift等方法详细介绍
2012/12/28 Javascript
ie6下png图片背景不透明的解决办法使用js实现
2013/01/11 Javascript
JavaScript基础篇之变量作用域、传值、传址的简单介绍与实例
2013/06/29 Javascript
Query中click(),bind(),live(),delegate()的区别
2013/11/19 Javascript
JS按字节截取字符长度实例
2013/11/20 Javascript
js获得当前时区夏令时发生和终止的时间代码
2014/02/23 Javascript
jQuery中last()方法用法实例
2015/01/06 Javascript
bootstrap网页框架的使用方法
2016/05/10 Javascript
判断数组是否包含某个元素的js函数实现方法
2016/05/19 Javascript
vue mixins组件复用的几种方式(小结)
2017/09/06 Javascript
15分钟深入了解JS继承分类、原理与用法
2019/01/19 Javascript
详解javascript 变量提升(Hoisting)
2019/03/12 Javascript
JS立即执行的匿名函数用法分析
2019/11/04 Javascript
javascript前端和后台进行数据交互方法示例
2020/08/07 Javascript
Python中函数及默认参数的定义与调用操作实例分析
2017/07/25 Python
Python使用 Beanstalkd 做异步任务处理的方法
2018/04/24 Python
django小技巧之html模板中调用对象属性或对象的方法
2018/11/30 Python
解决django服务器重启端口被占用的问题
2019/07/26 Python
Skyscanner澳大利亚:全球领先的旅游搜索网站
2018/03/24 全球购物
介绍一下gcc特性
2012/01/20 面试题
为什么说Ruby是一种真正的面向对象程序设计语言
2012/10/30 面试题
平面设计师工作职责范文
2013/12/03 职场文书
20年同学聚会感言
2014/02/03 职场文书
中学生关于梦想的演讲稿
2014/08/22 职场文书
2014年班长个人工作总结
2014/11/14 职场文书
医务人员岗前培训心得体会
2016/01/08 职场文书
小学生反邪教心得体会
2016/01/15 职场文书
2016年教师师德师风承诺书
2016/03/25 职场文书