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爬虫:通过关键字爬取百度图片
Feb 17 Python
python 寻找优化使成本函数最小的最优解的方法
Dec 28 Python
python实现K最近邻算法
Jan 29 Python
python 列表删除所有指定元素的方法
Apr 19 Python
python使用tornado实现简单爬虫
Jul 28 Python
10招!看骨灰级Pythoner玩转Python的方法
Apr 15 Python
Python计算不规则图形面积算法实现解析
Nov 22 Python
Python监控服务器实用工具psutil使用解析
Dec 19 Python
python3 pathlib库Path类方法总结
Dec 26 Python
tensorflow生成多个tfrecord文件实例
Feb 17 Python
Python函数递归调用实现原理实例解析
Aug 11 Python
通过代码实例解析Pytest运行流程
Aug 20 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的ajax框架xajax入门与试用介绍
2010/12/19 PHP
PHP中根据IP地址判断城市实现城市切换或跳转代码
2012/09/04 PHP
PHP中使用sleep造成mysql读取失败的案例和解决方法
2014/08/21 PHP
cloudgamer出品ImageZoom 图片放大效果
2010/04/01 Javascript
Jquery+ajax请求data显示在GridView上(asp.net)
2010/08/27 Javascript
js中switch case循环实例代码
2013/12/30 Javascript
javascript动态控制服务器控件实例
2014/09/05 Javascript
浅谈Node.js中的定时器
2015/06/18 Javascript
WordPress中鼠标悬停显示和隐藏评论及引用按钮的实现
2016/01/12 Javascript
基于javascript制作经典传统的拼图游戏
2016/03/22 Javascript
解析vue路由异步组件和懒加载案例
2018/06/08 Javascript
基于Vue实现微信小程序的图文编辑器
2018/07/25 Javascript
Vue render函数实战之实现tabs选项卡组件
2019/04/22 Javascript
使用webpack/gulp构建TypeScript项目的方法示例
2019/12/18 Javascript
使用JS实现动态时钟
2020/03/12 Javascript
vue双击事件2.0事件监听(点击-双击-鼠标事件)和事件修饰符操作
2020/07/27 Javascript
深入源码解析Python中的对象与类型
2015/12/11 Python
Python+MongoDB自增键值的简单实现
2016/11/04 Python
python xml.etree.ElementTree遍历xml所有节点实例详解
2016/12/04 Python
Python中异常重试的解决方案详解
2017/05/05 Python
python中requests和https使用简单示例
2018/01/18 Python
如何使用VSCode愉快的写Python于调试配置步骤
2018/04/06 Python
python简易实现任意位数的水仙花实例
2018/11/13 Python
Django框架实现的分页demo示例
2019/05/25 Python
python版百度语音识别功能
2019/07/09 Python
python numpy之np.random的随机数函数使用介绍
2019/10/06 Python
Python通过Manager方式实现多个无关联进程共享数据的实现
2019/11/07 Python
解决Python图形界面中设置尺寸的问题
2020/03/05 Python
python实现微信打飞机游戏
2020/03/24 Python
Timex手表官网:美国运动休闲手表品牌
2017/01/28 全球购物
Linux中如何用命令创建目录
2015/01/12 面试题
化学实验员岗位职责
2013/12/28 职场文书
办公室主任职责范本
2014/03/07 职场文书
最美乡村医生事迹材料
2014/06/02 职场文书
责任书格式
2015/01/29 职场文书
创业计划书之外语培训班
2019/11/02 职场文书