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处理中文编码和判断编码示例
Feb 26 Python
python实现解数独程序代码
Apr 12 Python
python利用paramiko连接远程服务器执行命令的方法
Oct 16 Python
关于反爬虫的一些简单总结
Dec 13 Python
python如何定义带参数的装饰器
Mar 20 Python
浅谈配置OpenCV3 + Python3的简易方法(macOS)
Apr 02 Python
深入浅析Python获取对象信息的函数type()、isinstance()、dir()
Sep 17 Python
python+pyqt5实现KFC点餐收银系统
Jan 24 Python
Python实现合并两个有序链表的方法示例
Jan 31 Python
python协程gevent案例 爬取斗鱼图片过程解析
Aug 27 Python
python分别打包出32位和64位应用程序
Feb 18 Python
python中68个内置函数的总结与介绍
Feb 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
150kHz到30Mhz完全冲浪手册
2020/03/20 无线电
用PHP产生动态的影像图
2006/10/09 PHP
在windows iis5下安装php4.0+mysql之我见
2006/10/09 PHP
Joomla数据库操作之JFactory::getDBO用法
2016/05/05 PHP
thinkphp分页集成实例
2017/07/24 PHP
Laravel 手动开关 Eloquent 修改器的操作方法
2019/12/30 PHP
JS 容错处理代码, 屏蔽错误信息
2021/03/09 Javascript
ext 代码生成器
2009/08/07 Javascript
jQuery each()方法的使用方法
2010/03/18 Javascript
JQuery EasyUI 对话框的使用方法
2010/10/24 Javascript
js/html光标定位的实现代码
2013/09/23 Javascript
当鼠标移动时出现特效的JQuery代码
2013/11/08 Javascript
JS两种定义方式的区别、内部原理
2013/11/21 Javascript
JavaScript将数组转换成CSV格式的方法
2015/03/19 Javascript
JavaScript File分段上传
2016/03/10 Javascript
NodeJS的Promise的用法解析
2016/05/05 NodeJs
基于angularjs实现图片放大镜效果
2016/08/31 Javascript
Bootstrap下拉菜单样式
2017/02/07 Javascript
详解Angular2 之 结构型指令
2017/06/21 Javascript
vue-resource调用promise取数据方式详解
2017/07/21 Javascript
详解Vue中使用Axios拦截器
2019/04/22 Javascript
django js 实现表格动态标序号的实例代码
2019/07/12 Javascript
vue 组件内获取actions的response方式
2019/11/08 Javascript
深入解析Python中函数的参数与作用域
2016/03/20 Python
python xml.etree.ElementTree遍历xml所有节点实例详解
2016/12/04 Python
Python爬取网易云音乐上评论火爆的歌曲
2017/01/19 Python
Python3爬虫教程之利用Python实现发送天气预报邮件
2018/12/16 Python
python实现银联支付和支付宝支付接入
2019/05/07 Python
Pytorch中accuracy和loss的计算知识点总结
2019/09/10 Python
工伤事故赔偿协议书
2014/04/15 职场文书
2014第二批党员干部对照“四风”找差距检查材料思想汇报
2014/09/18 职场文书
实习感想范文
2015/08/10 职场文书
2016入党积极分子党课学习心得体会
2015/10/09 职场文书
优秀范文:《但愿人长久》教学反思3篇
2019/10/24 职场文书
python可视化之颜色映射详解
2021/09/15 Python
js 数组 fill() 填充方法
2021/11/02 Javascript