Python排序函数的使用方法详解


Posted in Python onDecember 11, 2020

Python排序函数完美体现了Python语言的简洁性,对于List对象,我们可以直接调用sort()函数(这里称为"方法"更合适)来进行排序,而对于其他可迭代对象(如set,dict),我们可以使用更灵活的sorted()函数。

一.List的sort()函数

Python源码builtins.py文件对sort()函数的定义如下

def sort(self, key=None, reverse=False):
 """ L.sort(key=None, reverse=False) -> None -- stable sort *IN PLACE* """
 pass

可以看出:sort()函数没有返回值,有两个参数。key表示的是排依据的函数;reverse是指需不需要反转列表,默认为False表示的是升序,如果设为True表示的是降序。

sort()用法如下

L = [1, 2, 7, 4, 3]
L.sort()
print(L)
#[1, 2, 3, 4, 7]

我们加入一些参数来看看,如降序排序:

L = [1, 2, 7, 4, 3]
L.sort(reverse=True)
print(L)
#[7, 4, 3, 2, 1]

再比如,我们想通过key来实现降序排序,这里用到匿名函数lambda:

L = [1, 2, 7, 4, 3]
L.sort(key=lambda x : x*(-1))
print(L)
#[7, 4, 3, 2, 1]

当然,key还有很多用法,我们可以将其设为内置函数或者自定义函数,比如用绝对值函数:

L = [-1, 2, -7, 4, 3]
L.sort(key=abs)
print(L)
#[-1, 2, 3, 4, -7]

Python3对key的还有另外一种支持,就是通过functools模块的cmp_to_key函数,将传统的cmp函数转为key。这和lambda函数用法类似,但是对于比较的逻辑比较复杂的情况,这样的方式会更清晰更便于维护。

from functools import cmp_to_key
L = [-1, 2, -7, 4, 3]
def cmp(a,b):
 if abs(a) < abs(b):
 return -1
 else:
 return 1
L.sort(key=cmp_to_key(cmp))
print(L)

二.sorted()

比起sort()函数只能排序列表,sorted函数更通用一些。官方文档对其有详细说明:

sorted(iterable, *, key=None, reverse=False)
Return a new sorted list from the items in iterable.

sorted()返回值为List类型。参数列表iterable表示可迭代对象;*表示位置参数就此终结,后面的参数都必须用关键字来指定;key与reverse参数用法与sort()完全一致。

sorted()用法如下:

L = [1, 2, 7, 4, 3]
L1 = sorted(L)
print(L1)
#[1, 2, 3, 4, 7]

对于reverse和key的用法就不单独展示了,可以参考sort()。如果我们想要排序的对象是一个集合,那么用法与列表排序一样:

S = {1, 2, 7, 4, 3}
S1= sorted(S)
print(S1)
#[1, 2, 3, 4, 7]

注意这个排序对象是set对象,而结果是一个列表对象(set对象本就没有顺序一说)。如果我们要实现一个复杂一点的排序呢?比如对字典排序,排序依据是键值,排序结果是由键值对组成的列表:

Dict = {'a':2, 'b':3, 'c':7, 'd':4, 'e':1}
L = sorted(Dict.items(), key=lambda x : x[1])
print(L)
#[('e', 1), ('a', 2), ('b', 3), ('d', 4), ('c', 7)]

最后给一个Leetcode上的题(根据字符出现频率排序):

给定一个字符串,请将字符串里的字符按照出现的频率降序排列。
输入:
"tree"
输出:
"eert"
解释:
'e'出现两次,'r'和't'都只出现一次。因此'e'必须出现在'r'和't'之前。此外,"eetr"也是一个有效的答案。

通过使用sorted函数代码就很清晰易读了:

def frequencySort(s):
 d = {}
 for i in s:
 d[i] = d.get(i,0) + 1
 L = sorted(d.keys(), key=lambda x: d[x], reverse=True)
 s = ''
 for i in L:
 s += i * d[i]
 return s

注意这里的d.keys()生成的是一个由key组成的可迭代对象,而前面代码的Dict.items()生成的是一个由键值对对象(这是一个Tuple对象)组成的可迭代对象。

到此这篇关于Python排序函数用法的文章就介绍到这了,更多相关Python排序函数用法内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
使用python BeautifulSoup库抓取58手机维修信息
Nov 21 Python
python获取beautifulphoto随机某图片代码实例
Dec 18 Python
python提取页面内url列表的方法
May 25 Python
Python八大常见排序算法定义、实现及时间消耗效率分析
Apr 27 Python
Python 十六进制整数与ASCii编码字符串相互转换方法
Jul 09 Python
Python3的介绍、安装和命令行的认识(推荐)
Oct 20 Python
基于python分析你的上网行为 看看你平时上网都在干嘛
Aug 13 Python
Python实现语音识别和语音合成功能
Sep 20 Python
Python线程指南分享
Nov 19 Python
python定时截屏实现
Nov 02 Python
浅析Python打包时包含静态文件处理方法
Jan 15 Python
Django实现翻页的示例代码
May 24 Python
Python数据分析库pandas高级接口dt的使用详解
Dec 11 #Python
python 自定义异常和主动抛出异常(raise)的操作
Dec 11 #Python
解决python 在for循环并且pop数组的时候会跳过某些元素的问题
Dec 11 #Python
基于Python中Remove函数的用法讨论
Dec 11 #Python
在 Python 中使用 7zip 备份文件的操作
Dec 11 #Python
Python文件名匹配与文件复制的实现
Dec 11 #Python
Python: glob匹配文件的操作
Dec 11 #Python
You might like
PHP下对字符串的递增运算代码
2010/08/21 PHP
延长phpmyadmin登录时间的方法
2011/02/06 PHP
php实现将wav文件转换成图像文件并在页面中显示的方法
2015/04/21 PHP
详解PHP的Yii框架中日志的相关配置及使用
2015/12/08 PHP
thinkPHP5.0框架URL访问方法详解
2017/03/18 PHP
Vagrant(WSL)+PHPStorm+Xdebu 断点调试环境搭建
2019/12/13 PHP
javascript 播放器 控制
2007/01/22 Javascript
二叉树先序遍历的非递归算法具体实现
2014/01/09 Javascript
标题过长使用javascript按字节截取字符串
2014/04/24 Javascript
javascript实现汉字转拼音代码分享
2015/04/20 Javascript
jquery实现选中单选按钮下拉伸缩效果
2015/08/06 Javascript
js html5 css俄罗斯方块游戏再现
2016/10/17 Javascript
基于jQuery实现的幻灯图片切换
2016/12/02 Javascript
vue里面使用mui的弹出日期选择插件实例
2018/09/16 Javascript
微信小程序实现点击图片旋转180度并且弹出下拉列表
2018/11/27 Javascript
[01:03]DOTA2新的征程 你的脚印值得踏上
2014/08/13 DOTA
常用python数据类型转换函数总结
2014/03/11 Python
编写自定义的Django模板加载器的简单示例
2015/07/21 Python
Python2.7读取PDF文件的方法示例
2017/07/13 Python
用Python实现筛选文件脚本的方法
2018/10/27 Python
Python之pymysql的使用小结
2019/07/01 Python
python支付宝支付示例详解
2019/08/22 Python
python破解bilibili滑动验证码登录功能
2019/09/11 Python
python运用sklearn实现KNN分类算法
2019/10/16 Python
python框架flask表单实现详解
2019/11/04 Python
使用css3制作登录表单的步骤
2014/04/07 HTML / CSS
美国著名珠宝品牌之一:Jared The Galleria Of Jewelry
2016/10/01 全球购物
Mytheresa英国官网:拥有160多个奢侈品品牌
2016/10/09 全球购物
阿迪达斯墨西哥官方网站:adidas墨西哥
2017/11/03 全球购物
瑞典廉价机票预订网站:Seat24
2018/06/19 全球购物
Pretty Green美国:英式摇滚服饰风格代表品牌之一
2019/01/23 全球购物
俄罗斯在线手表和珠宝商店:AllTime
2019/09/28 全球购物
个性车贴标语
2014/06/24 职场文书
夫妻分居协议书范本
2014/11/28 职场文书
银行求职自荐信范文
2015/03/04 职场文书
JavaScript嵌入百度地图API的最详细方法
2021/04/16 Javascript