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中变量交换的例子
Aug 25 Python
python的re模块应用实例
Sep 26 Python
深入解析Python编程中super关键字的用法
Jun 24 Python
pandas修改DataFrame列名的方法
Apr 08 Python
Python实现Linux监控的方法
May 16 Python
利用pandas合并多个excel的方法示例
Oct 10 Python
python flask搭建web应用教程
Nov 19 Python
Python调用接口合并Excel表代码实例
Mar 31 Python
Python中的Cookie模块如何使用
Jun 04 Python
python Paramiko使用示例
Sep 21 Python
python smtplib发送多个email联系人的实现
Oct 09 Python
用 Python 元类的特性实现 ORM 框架
May 19 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
dedecms模板标签代码官方参考
2007/03/17 PHP
PHP 表单提交给自己
2008/07/24 PHP
php实现往pdf中加数字签名操作示例【附源码下载】
2018/08/07 PHP
实例讲解php将字符串输出到HTML
2019/01/27 PHP
学习jquery必备 api中英文对照的chm手册 下载
2007/05/03 Javascript
JavaScript 操作键盘的Enter事件(键盘任何事件),兼容多浏览器
2010/10/11 Javascript
jQuery EasyUI API 中文文档 - ComboGrid 组合表格
2011/10/13 Javascript
javascript实现字符串反转的方法
2015/02/05 Javascript
javascript学习笔记整理(概述、变量、数据类型简介)
2015/10/25 Javascript
纯js仿淘宝京东商品放大镜功能
2017/03/02 Javascript
十大热门的JavaScript框架和库
2017/03/21 Javascript
Vue render深入开发讲解
2018/04/13 Javascript
webstrom Debug 调试vue项目的方法步骤
2018/07/17 Javascript
JS栈stack类的实现与使用方法示例
2019/01/31 Javascript
详解JavaScript中的坐标和距离
2019/05/27 Javascript
vue 开发之路由配置方法详解
2019/12/02 Javascript
Python使用Flask框架同时上传多个文件的方法
2015/03/21 Python
Python实现PS滤镜特效之扇形变换效果示例
2018/01/26 Python
python操作oracle的完整教程分享
2018/01/30 Python
浅谈Tensorflow模型的保存与恢复加载
2018/04/26 Python
使用Python对微信好友进行数据分析
2018/06/27 Python
Python3 shutil(高级文件操作模块)实例用法总结
2020/02/19 Python
python GUI库图形界面开发之PyQt5拖放控件实例详解
2020/02/25 Python
Python如何使用27行代码绘制星星图
2020/07/20 Python
浅谈Python xlwings 读取Excel文件的正确姿势
2021/02/26 Python
施华洛世奇美国官网:SWAROVSKI美国
2018/02/08 全球购物
日本亚马逊官方网站:Amazon.co.jp
2020/04/14 全球购物
List、Map、Set三个接口,存取元素时,各有什么特点?
2015/09/27 面试题
经贸日语专业个人求职信
2013/12/13 职场文书
《鸿门宴》教学反思
2014/04/22 职场文书
团支部推优材料
2014/05/21 职场文书
财务审计整改报告
2014/11/06 职场文书
房屋租房协议书范本
2014/12/04 职场文书
幼师辞职信范文
2015/02/27 职场文书
java泛型通配符详解
2021/07/25 Java/Android
python之django路由和视图案例教程
2021/07/26 Python