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实现的多线程端口扫描工具分享
Jan 21 Python
教你用Python脚本快速为iOS10生成图标和截屏
Sep 22 Python
基于python内置函数与匿名函数详解
Jan 09 Python
python opencv3实现人脸识别(windows)
May 25 Python
Python爬取数据并写入MySQL数据库的实例
Jun 21 Python
浅谈Python在pycharm中的调试(debug)
Nov 29 Python
Python函数装饰器常见使用方法实例详解
Mar 30 Python
可视化pytorch 模型中不同BN层的running mean曲线实例
Jun 24 Python
Python通过队列来实现进程间通信的示例
Oct 14 Python
python 批量将中文名转换为拼音
Feb 07 Python
pandas 按日期范围筛选数据的实现
Feb 20 Python
python 爬取吉首大学网站成绩单
Jun 02 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
SONY SRF-40W电路分析
2021/03/02 无线电
php使用ereg验证文件上传的方法
2014/12/16 PHP
ThinkPHP实现转换数据库查询结果数据到对应类型的方法
2017/11/16 PHP
PHP常用字符串输出方法分析(echo,print,printf及sprintf)
2021/03/09 PHP
checkbox 多选框 联动实现代码
2008/10/22 Javascript
javascript instanceof 与typeof使用说明
2010/01/11 Javascript
jquery获取div距离窗口和父级dv的距离示例
2013/10/10 Javascript
js日期联动示例
2014/05/02 Javascript
ECMAScript中函数function类型
2015/06/03 Javascript
JQuery EasyUI的使用
2016/02/24 Javascript
json传值以及ajax接收详解
2016/05/24 Javascript
Jquery Easyui表单组件Form使用详解(30)
2016/12/19 Javascript
javascript实现简易计算器
2017/02/01 Javascript
浅谈ng-zorro使用心得
2018/12/03 Javascript
VUEX采坑之路之获取不到$store的解决方法
2019/11/08 Javascript
JS实现图片懒加载(lazyload)过程详解
2020/04/02 Javascript
js实现查询商品案例
2020/07/22 Javascript
[05:03]显微镜下的DOTA2第十期——Ti3豪之超神幽鬼
2014/06/23 DOTA
Python的字典和列表的使用中一些需要注意的地方
2015/04/24 Python
解决python执行不输出系统命令弹框的问题
2019/06/24 Python
如何使用python操作vmware
2019/07/27 Python
基于Python制作一副扑克牌过程详解
2020/10/19 Python
使用Python制作一盏 3D 花灯喜迎元宵佳节
2021/02/26 Python
大学生毕业的自我评价分享
2014/01/02 职场文书
十岁生日家长答谢词
2014/01/17 职场文书
社区党务公开实施方案
2014/03/18 职场文书
工业设计毕业生自荐信
2014/04/13 职场文书
2014五一国际劳动节活动总结范文
2014/04/14 职场文书
关于读书的演讲稿600字
2014/08/27 职场文书
出售房屋委托书范本
2014/09/24 职场文书
2016年学校党支部公开承诺书
2016/03/25 职场文书
2016年五一国际劳动节活动总结
2016/04/06 职场文书
创业计划书之家政服务
2019/09/18 职场文书
NGINX 权限控制文件预览和下载的实现原理
2022/01/18 Servers
如何让你的Nginx支持分布式追踪详解
2022/07/07 Servers
mysql函数之截取字符串的实现
2022/08/14 MySQL