详解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 相关文章推荐
ssh批量登录并执行命令的python实现代码
May 25 Python
从零学python系列之数据处理编程实例(二)
May 22 Python
Python环境变量设置方法
Aug 28 Python
python将文本中的空格替换为换行的方法
Mar 19 Python
PyQt5 pyqt多线程操作入门
May 05 Python
浅析Python与Mongodb数据库之间的操作方法
Jul 01 Python
基于python分析你的上网行为 看看你平时上网都在干嘛
Aug 13 Python
python常用数据重复项处理方法
Nov 22 Python
基于pytorch的lstm参数使用详解
Jan 14 Python
TensorFlow使用Graph的基本操作的实现
Apr 22 Python
django admin 根据choice字段选择的不同来显示不同的页面方式
May 13 Python
如何用Python 加密文件
Sep 10 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实现分页的一个示例
2006/10/09 PHP
set_include_path和get_include_path使用及注意事项
2013/02/02 PHP
windows下配置apache+php+mysql时出现问题的处理方法
2014/06/20 PHP
destoon二次开发常用数据库操作
2014/06/21 PHP
PHP+mysql+ajax轻量级聊天室实现方法详解
2016/10/17 PHP
PHP生成各种随机验证码的方法总结【附demo源码】
2017/06/05 PHP
PHP合并两个或多个数组的方法
2019/01/20 PHP
JS代码放在head和body中的区别分析
2011/12/01 Javascript
javascript 在firebug调试时用console.log的方法
2012/05/10 Javascript
使用jQuery不判断浏览器高度解决iframe自适应高度问题
2014/12/16 Javascript
原生Ajax 和jQuery Ajax的区别示例分析
2014/12/17 Javascript
jquery带下拉菜单和焦点图代码分享
2015/08/24 Javascript
js实现商城星星评分的效果
2015/12/29 Javascript
Node.js本地文件操作之文件拷贝与目录遍历的方法
2016/02/16 Javascript
JS正则截取两个字符串之间及字符串前后内容的方法
2017/01/06 Javascript
jquery做个日期选择适用于手机端示例
2017/01/10 Javascript
JS简单获取当前年月日星期的方法示例
2017/02/07 Javascript
写jQuery插件时的注意点
2017/02/20 Javascript
xmlplus组件设计系列之树(Tree)(9)
2017/05/02 Javascript
jQuery实现返回顶部按钮和scroll滚动功能[带动画效果]
2017/07/05 jQuery
Vue.js实现表格渲染的方法
2018/09/07 Javascript
JavaScript实现shuffle数组洗牌操作示例
2019/01/03 Javascript
react用Redux中央仓库实现一个todolist
2019/09/29 Javascript
基于JS实现table导出Excel并保留样式
2020/05/19 Javascript
vue 扩展现有组件的操作
2020/08/14 Javascript
在Python的gevent框架下执行异步的Solr查询的教程
2015/04/16 Python
python中通过selenium简单操作及元素定位知识点总结
2019/09/10 Python
python conda操作方法
2019/09/11 Python
Python jieba库用法及实例解析
2019/11/04 Python
Python装饰器结合递归原理解析
2020/07/02 Python
使用BeautifulSoup4解析XML的方法小结
2020/12/07 Python
利用三角函数在canvas上画虚线的方法
2018/01/11 HTML / CSS
北美最大的零售退货翻新商:VIP Outlet
2019/11/21 全球购物
浪漫婚礼主题活动策划方案
2014/09/15 职场文书
2015年社区居委会工作总结
2015/05/18 职场文书
VUE中的v-if与v-show区别介绍
2022/03/13 Vue.js