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 19 Python
python实现简单的socket server实例
Apr 29 Python
Python中装饰器高级用法详解
Dec 25 Python
微信小程序跳一跳游戏 python脚本跳一跳刷高分技巧
Jan 04 Python
PyQT实现多窗口切换
Apr 20 Python
Python常见字典内建函数用法示例
May 14 Python
Python操作json的方法实例分析
Dec 06 Python
对python 操作solr索引数据的实例详解
Dec 07 Python
Python 脚本实现淘宝准点秒杀功能
Nov 13 Python
python实现矩阵和array数组之间的转换
Nov 29 Python
python将数组n等分的实例
Dec 02 Python
Django media static外部访问Django中的图片设置教程
Apr 07 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英文单词统计器
2016/06/23 PHP
国外的为初学者写的JavaScript教程
2008/06/09 Javascript
javascript css在IE和Firefox中区别分析
2009/02/18 Javascript
基于jQuery的图片大小自动适应实现代码
2010/11/17 Javascript
JS无限树状列表实现代码
2011/01/11 Javascript
js 实现的可折叠留言板(附源码下载)
2014/07/01 Javascript
jQuery实现元素拖拽并cookie保存顺序的方法
2016/02/20 Javascript
javascript的正则匹配方法学习
2016/02/24 Javascript
jQuery  ready方法实现原理详解
2016/10/19 Javascript
深入nodejs中流(stream)的理解
2017/03/27 NodeJs
微信小程序搜索组件wxSearch实例详解
2017/06/08 Javascript
基于Bootstrap实现城市三级联动
2017/11/23 Javascript
OkHttp踩坑随笔为何 response.body().string() 只能调用一次
2018/01/08 Javascript
vue3.0 CLI - 2.3 - 组件 home.vue 中学习指令和绑定
2018/09/14 Javascript
使用vue自定义指令开发表单验证插件validate.js
2019/05/23 Javascript
js/jQuery实现全选效果
2019/06/17 jQuery
js实现文字头像的生成代码
2020/03/07 Javascript
[02:06]DOTA2肉山黑名单魔法终结者 敌法师中文配音鉴赏
2013/06/17 DOTA
使用python装饰器验证配置文件示例
2014/02/24 Python
在 Django/Flask 开发服务器上使用 HTTPS
2014/07/03 Python
20个常用Python运维库和模块
2018/02/12 Python
flask框架中勾子函数的使用详解
2018/08/01 Python
python数据批量写入ScrolledText的优化方法
2018/10/11 Python
Django给admin添加Action的步骤详解
2019/05/01 Python
解决yum对python依赖版本问题
2019/07/05 Python
python实现函数极小值
2019/07/10 Python
Django全局启用登陆验证login_required的方法
2020/06/02 Python
PyCharm2020.1.2社区版安装,配置及使用教程详解(Windows)
2020/08/07 Python
python中os.remove()用法及注意事项
2021/01/31 Python
Origins加拿大官网:雅诗兰黛集团高端植物护肤品牌
2017/11/19 全球购物
自动化专业个人求职信范文
2013/11/29 职场文书
信息总监管理职责范本
2014/03/08 职场文书
我的1919观后感
2015/06/03 职场文书
致运动员的广播稿
2015/08/19 职场文书
Go语言空白表示符_的实例用法
2021/07/04 Golang
基于PostgreSQL/openGauss 的分布式数据库解决方案
2021/12/06 PostgreSQL