详解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通过win32 COM打开Excel并添加Sheet的方法
May 02 Python
Python实现随机创建电话号码的方法示例
Dec 07 Python
python对象与json相互转换的方法
May 07 Python
Python数据可视化实现正态分布(高斯分布)
Aug 21 Python
Python 装饰器@,对函数进行功能扩展操作示例【开闭原则】
Oct 17 Python
Python进程池Pool应用实例分析
Nov 27 Python
使用pymysql查询数据库,把结果保存为列表并获取指定元素下标实例
May 15 Python
python爬虫把url链接编码成gbk2312格式过程解析
Jun 08 Python
Django路由层URLconf作用及原理解析
Sep 24 Python
python 调整图片亮度的示例
Dec 03 Python
手把手教你用Django执行原生SQL的方法
Feb 18 Python
python超详细实现完整学生成绩管理系统
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
php数组去重的函数代码
2013/02/03 PHP
php使用smtp发送支持附件的邮件示例
2014/04/13 PHP
PHP图片库imagemagick安装方法
2014/09/23 PHP
php相对当前文件include其它文件的方法
2015/03/13 PHP
thinkphp的dump函数无输出实例代码
2016/11/15 PHP
Thinkphp事务操作实例(推荐)
2017/04/01 PHP
详解PHP使用Redis存储session时的一个Warning定位
2017/07/05 PHP
php学习笔记之mb_strstr的基本使用
2018/02/03 PHP
Laravel6.18.19如何优雅的切换发件账户
2020/06/14 PHP
jquery checkbox全选、取消全选实现代码
2010/03/05 Javascript
jQuery图片播放8款精美插件分享
2013/02/17 Javascript
Jquery实现图片左右自动滚动示例
2013/09/25 Javascript
网站内容禁止复制和粘贴、另存为的js代码
2014/02/26 Javascript
JavaScript中匿名函数用法实例
2015/03/23 Javascript
JQuery显示隐藏页面元素的方法总结
2015/04/16 Javascript
在for循环中length值是否需要缓存
2015/07/27 Javascript
原生js实现秒表计时器功能
2017/02/16 Javascript
JS实现颜色的10进制转化成rgba格式的方法
2017/09/04 Javascript
基于iScroll实现内容滚动效果
2018/03/21 Javascript
JavaScript中的一些实用小技巧总结
2019/04/07 Javascript
[01:50]WODOTA制作 DOTA2中文宣传片《HERO》
2013/04/28 DOTA
Python是编译运行的验证方法
2015/01/30 Python
python获取当前时间对应unix时间戳的方法
2015/05/15 Python
深入解析Python中的lambda表达式的用法
2015/08/28 Python
Fiddler如何抓取手机APP数据包
2016/01/22 Python
Python使用PDFMiner解析PDF代码实例
2017/03/27 Python
解决Python3下map函数的显示问题
2019/12/04 Python
用python进行视频剪辑
2020/11/02 Python
阿根廷首家户外用品制造商和经销商:Montagne
2018/02/12 全球购物
房地产融资计划书
2014/01/10 职场文书
益达广告词
2014/03/14 职场文书
员工入职担保书范文
2014/04/01 职场文书
开展读书活动总结
2014/06/30 职场文书
八项规定个人对照检查材料思想汇报
2014/09/25 职场文书
答谢词范文
2015/01/05 职场文书
golang fmt格式“占位符”的实例用法详解
2021/07/04 Golang