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 16 Python
Pycharm学习教程(7)虚拟机VM的配置教程
May 04 Python
Python轻量级ORM框架Peewee访问sqlite数据库的方法详解
Jul 20 Python
python自动化测试之如何解析excel文件
Jun 27 Python
Python实现点云投影到平面显示
Jan 18 Python
python实现根据给定坐标点生成多边形mask的例子
Feb 18 Python
Python面向对象中类(class)的简单理解与用法分析
Feb 21 Python
解决pycharm中opencv-python导入cv2后无法自动补全的问题(不用作任何文件上的修改)
Mar 05 Python
基于Python把网站域名解析成ip地址
May 25 Python
python 基于UDP协议套接字通信的实现
Jan 22 Python
解决pytorch-gpu 安装失败的记录
May 24 Python
Pandas加速代码之避免使用for循环
May 30 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 多线程上下文中安全写文件实现代码
2009/12/28 PHP
ubuntu 编译安装php 5.3.3+memcache的方法
2010/08/05 PHP
php从数组中随机抽取一些元素的代码
2012/11/05 PHP
解析PHP SPL标准库的用法(遍历目录,查找固定条件的文件)
2013/06/18 PHP
PHP实现的蚂蚁爬杆路径算法代码
2015/12/03 PHP
为Plesk PHP7启用Oracle OCI8扩展方法总结
2019/03/29 PHP
JS 动态加载脚本的4种方法
2009/05/05 Javascript
JavaScript游戏之优化篇
2010/11/08 Javascript
Javascript处理DOM元素事件实现代码
2012/05/23 Javascript
JavaScript实现弹出子窗口并传值给父窗口
2014/12/18 Javascript
有关json_decode乱码及NULL的问题
2015/10/13 Javascript
jQuery中cookie插件用法实例分析
2015/12/04 Javascript
有关jQuery中parent()和siblings()的小问题
2016/06/01 Javascript
JS实现六位字符密码输入器功能
2016/08/19 Javascript
jQuery判断邮箱格式对错实例代码讲解
2017/04/12 jQuery
微信小程序CSS3动画下拉菜单效果
2018/11/04 Javascript
vue-preview动态获取图片宽高并增加旋转功能的实现
2020/07/29 Javascript
jquery实现加载更多&quot;转圈圈&quot;效果(示例代码)
2020/11/09 jQuery
javascript前端实现多视频上传
2020/12/13 Javascript
Python中的startswith和endswith函数使用实例
2014/08/25 Python
python通过post提交数据的方法
2015/05/06 Python
利用python获取某年中每个月的第一天和最后一天
2016/12/15 Python
Python 3中print函数的使用方法总结
2017/08/08 Python
pycharm 将python文件打包为exe格式的方法
2019/01/16 Python
Python实现一个简单的毕业生信息管理系统的示例代码
2020/06/08 Python
详解Python中的路径问题
2020/09/02 Python
Oakley官网:运动太阳镜、雪镜和服装
2016/09/30 全球购物
怎样写留学自荐信
2013/11/11 职场文书
开学典礼决心书
2014/03/11 职场文书
节约每一滴水演讲稿
2014/09/09 职场文书
2014国庆节演讲稿:祖国在我心中(400字)
2014/09/25 职场文书
销售辞职信范文
2015/03/02 职场文书
节约用电倡议书
2015/04/28 职场文书
大学生心理健康活动总结
2015/05/08 职场文书
老乡会致辞
2015/07/28 职场文书
初中政教处工作总结
2015/08/12 职场文书