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中的文件和目录操作实现代码
Mar 13 Python
浅析Python 中整型对象存储的位置
May 16 Python
python模块之sys模块和序列化模块(实例讲解)
Sep 13 Python
python中WSGI是什么,Python应用WSGI详解
Nov 24 Python
python scipy求解非线性方程的方法(fsolve/root)
Nov 12 Python
pandas去重复行并分类汇总的实现方法
Jan 29 Python
简单了解Python3里的一些新特性
Jul 13 Python
利用Tensorflow构建和训练自己的CNN来做简单的验证码识别方式
Jan 20 Python
Python编程快速上手——Excel到CSV的转换程序案例分析
Feb 28 Python
python Canny边缘检测算法的实现
Apr 24 Python
python实现图片转字符画的完整代码
Feb 21 Python
tensorflow中的梯度求解及梯度裁剪操作
May 26 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中使用Curl、socket、file_get_contents三种方法POST提交数据
2011/08/12 PHP
table标签的结构与合并单元格的实现方法
2013/07/24 PHP
PHP的反射机制实例详解
2017/03/29 PHP
php实现用户注册密码的crypt加密
2017/06/08 PHP
解决在laravel中auth建立时候遇到的问题
2019/10/15 PHP
Ajax执行顺序流程及回调问题分析
2012/12/10 Javascript
如何让DIV可编辑、可拖动示例代码
2013/09/18 Javascript
js 时间格式与时间戳的相互转换示例代码
2013/12/25 Javascript
Three.js快速入门教程
2016/09/09 Javascript
angular源码学习第一篇 setupModuleLoader方法
2016/10/20 Javascript
如何使用bootstrap框架 bootstrap入门必看!
2017/04/13 Javascript
Bootstrap栅格系统的使用详解
2017/10/30 Javascript
nodejs+mongodb+vue前后台配置ueditor的示例代码
2018/01/02 NodeJs
解决vue中虚拟dom,无法实时更新的问题
2018/09/15 Javascript
vue 项目 iOS WKWebView 加载
2019/04/17 Javascript
微信小程序使用npm包的方法步骤
2019/08/13 Javascript
react+antd 递归实现树状目录操作
2020/11/02 Javascript
Python列表计数及插入实例
2014/12/17 Python
Pycharm以root权限运行脚本的方法
2019/01/19 Python
python+pyqt5实现图片批量缩放工具
2019/03/18 Python
python Tcp协议发送和接收信息的例子
2019/07/22 Python
详解Python中的分支和循环结构
2020/02/11 Python
python scatter函数用法实例详解
2020/02/11 Python
python如何变换环境
2020/07/21 Python
Html5嵌入钉钉的实现示例
2020/06/04 HTML / CSS
洛佩桑酒店官方网站:Lopesan Hotels
2019/04/15 全球购物
Nike墨西哥官网:Nike MX
2020/08/30 全球购物
eDreams德国:南欧领先的在线旅游公司
2020/12/07 全球购物
室内设计自我鉴定
2013/10/15 职场文书
新闻专业本科生的自我评价分享
2013/11/20 职场文书
会展中心部门工作职责
2013/11/27 职场文书
低碳环保演讲稿
2014/08/28 职场文书
千手观音观后感
2015/06/03 职场文书
Python进行区间取值案例讲解
2021/08/02 Python
MySQL中一条update语句是如何执行的
2022/03/16 MySQL
教你使用Python获取QQ音乐某个歌手的歌单
2022/04/03 Python