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程序中的实现及简单改进
May 04 Python
使用python绘制常用的图表
Aug 27 Python
用python找出那些被“标记”的照片
Apr 20 Python
详谈python http长连接客户端
Jun 12 Python
linux安装Python3.4.2的操作方法
Sep 28 Python
使用GitHub和Python实现持续部署的方法
May 09 Python
python opencv 简单阈值算法的实现
Aug 04 Python
python3 selenium自动化 frame表单嵌套的切换方法
Aug 23 Python
python两个_多个字典合并相加的实例代码
Dec 26 Python
tensorflow 环境变量设置方式
Feb 06 Python
利用Opencv实现图片的油画特效实例
Feb 28 Python
Pytorch 统计模型参数量的操作 param.numel()
May 13 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/07/17 PHP
模板引擎正则表达式调试小技巧
2011/07/20 PHP
PHP使用PHPExcel删除Excel单元格指定列的方法
2016/07/06 PHP
PHP多种序列化/反序列化的方法详解
2017/06/23 PHP
js实现权限树的更新权限时的全选全消功能
2009/02/17 Javascript
Jquery中的CheckBox、RadioButton、DropDownList的取值赋值实现代码
2011/10/12 Javascript
JS TextArea字符串长度限制代码集合
2012/10/31 Javascript
JS实现简单的顶部定时关闭层效果
2014/06/15 Javascript
分享一个自己写的简单的javascript分页组件
2015/02/15 Javascript
javascript实现的字符串与十六进制表示字符串相互转换方法
2015/07/17 Javascript
浅谈Node.js CVE-2017-14849 漏洞分析(详细步骤)
2017/11/10 Javascript
JS组件系列之Gojs组件 前端图形化插件之利器
2017/11/29 Javascript
Vue 使用计时器实现跑马灯效果的实例代码
2019/07/11 Javascript
vue-router路由模式详解(小结)
2019/08/26 Javascript
mpvue微信小程序的接口请求fly全局拦截代码实例
2019/11/13 Javascript
vue制作toast组件npm包示例代码
2020/10/29 Javascript
pyqt4教程之widget使用示例分享
2014/03/07 Python
Python OS模块常用函数说明
2015/05/23 Python
Python实现遍历目录的方法【测试可用】
2017/03/22 Python
python使用PyCharm进行远程开发和调试
2017/11/02 Python
python实战教程之自动扫雷
2018/07/13 Python
PyTorch: 梯度下降及反向传播的实例详解
2019/08/20 Python
Python中如何将一个类方法变为多个方法
2019/12/30 Python
小 200 行 Python 代码制作一个换脸程序
2020/05/12 Python
python 写函数在一定条件下需要调用自身时的写法说明
2020/06/01 Python
党员公开承诺事项
2014/03/25 职场文书
服务承诺书格式
2014/05/21 职场文书
入党推优材料
2014/06/02 职场文书
节约能源标语
2014/06/17 职场文书
就业意向书
2014/07/29 职场文书
2014年个人债务授权委托书范本
2014/09/22 职场文书
企业工会工作总结2015
2015/05/13 职场文书
六年级语文教学反思
2016/03/03 职场文书
2019年房屋委托租赁合同范本(通用版)!
2019/07/17 职场文书
一篇文章弄懂Python关键字、标识符和变量
2021/07/15 Python
Java 轮询锁使用时遇到问题
2022/05/11 Java/Android