详解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实现进程同步和通信的方法
Jan 02 Python
Django管理员账号和密码忘记的完美解决方法
Dec 06 Python
Python两个字典键同值相加的几种方法
Mar 05 Python
详解python爬虫系列之初识爬虫
Apr 06 Python
python opencv摄像头的简单应用
Jun 06 Python
python使用opencv对图像mask处理的方法
Jul 05 Python
关于Python中的向量相加和numpy中的向量相加效率对比
Aug 26 Python
Python列表list常用内建函数实例小结
Oct 22 Python
关于tensorflow的几种参数初始化方法小结
Jan 04 Python
python3.8下载及安装步骤详解
Jan 15 Python
Pytest如何使用skip跳过执行测试
Aug 13 Python
python Pexpect模块的使用
Dec 25 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公用函数列表[正则]
2007/02/22 PHP
php学习笔记 数组遍历实现代码
2011/06/09 PHP
php图片的裁剪与缩放生成符合需求的缩略图
2013/01/11 PHP
php使用filter过滤器验证邮箱 ipv6地址 url验证
2013/12/25 PHP
php判断当前用户已在别处登录的方法
2015/01/06 PHP
php实现连接access数据库并转txt写入的方法
2017/02/08 PHP
关于IE浏览器以及Firefox下的javascript冒泡事件的响应层级
2010/10/14 Javascript
Jquery公告滚动+AJAX后台得到数据
2011/04/14 Javascript
JS getAttribute和setAttribute(取得和设置属性)的使用介绍
2013/07/10 Javascript
javascript的渐进增强与平稳退化浅谈
2013/11/12 Javascript
jquery 检测元素是否存在的实例代码
2013/11/19 Javascript
使用jQuery快速解决input中placeholder值在ie中无法支持的问题
2014/01/02 Javascript
JavaScript面向对象编程入门教程
2014/04/16 Javascript
jquery实现带二级菜单的导航示例
2014/04/28 Javascript
AngularJS中的表单简单入门
2016/07/28 Javascript
微信小程序 绘图之饼图实现
2016/10/24 Javascript
详谈Angular路由与Nodejs路由的区别
2017/03/05 NodeJs
浅谈Postman解决token传参的问题
2018/03/31 Javascript
[39:11]DOTA2上海特级锦标赛C组资格赛#2 LGD VS Newbee第二局
2016/02/28 DOTA
以Python的Pyspider为例剖析搜索引擎的网络爬虫实现方法
2015/03/30 Python
python检查序列seq是否含有aset中项的方法
2015/06/30 Python
Python实现的概率分布运算操作示例
2017/08/14 Python
Python操作mysql数据库实现增删查改功能的方法
2018/01/15 Python
Python从数据库读取大量数据批量写入文件的方法
2018/12/10 Python
django url到views参数传递的实例
2019/07/19 Python
Python爬虫获取页面所有URL链接过程详解
2020/06/04 Python
python如何进入交互模式
2020/07/06 Python
马来西亚综合购物网站:Lazada马来西亚
2018/06/05 全球购物
ABOUT YOU罗马尼亚:超过600个时尚品牌
2019/09/19 全球购物
意大利单身交友网站:Meetic
2020/07/12 全球购物
竞聘演讲稿精彩开头和结尾
2014/05/14 职场文书
美术教师个人总结
2015/02/06 职场文书
2015年市场营销工作总结
2015/07/23 职场文书
Python+Tkinter制作专属图形化界面
2022/04/01 Python
MySQL 自动填充 create_time 和 update_time
2022/05/20 MySQL
MySql按时,天,周,月进行数据统计
2022/08/14 MySQL