python排序函数sort()与sorted()的区别


Posted in Python onSeptember 18, 2018

python 中sorted与sort有什么区别

sort(cmp=None, key=None, reverse=False)
sorted(iterable, cmp=None, key=None, reverse=False)
sort是容器的函数,用List的成员函数sort进行排序
sorted是Python的内建函数相同的参数,用built-in函数sorted进行排序
sorted(iterable,key=None,reverse=False),返回新的列表,对所有可迭代的对象均有效
sort(key=None,reverse=False) 就地改变列表 reverse:True反序;False 正序

例如:

>>> a=[1,3,5,2,9,4,7,8,6,0]
>>> a.sort()
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> a=[1,3,5,2,9,4,7,8,6,0]
>>> sorted(a)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> a
[1, 3, 5, 2, 9, 4, 7, 8, 6, 0]

以下是详细说明

Python list内置sort()方法用来排序,也可以用python内置的全局sorted()方法来对可迭代的序列排序生成新的序列。

sorted(iterable,key=None,reverse=False),返回新的列表,对所有可迭代的对象均有效

sort(key=None,reverse=False) 就地改变列表 reverse:True反序;False 正序

sort是容器的函数:sort(cmp=None, key=None, reverse=False)

sorted是python的内建函数:sorted(iterable, cmp=None, key=None, reverse=False)

参数解析:

cmp:比较函数,比较什么参数由key决定。例如:cmp(e1, e2) 是具有两个参数的比较函数,返回值:负数(e1 < e2);0(e1 == e2);正数( e1 > e2)。
key:用列表元素的某个属性或函数作为关键字。
reverse:排序规则,可以选择True或者False。
sorted多一个参数iterable:待排序的可迭代类型的容器 

示例1:

>>> a=[1,2,5,3,9,4,6,8,7,0,12]
>>> a.sort()
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 12]


>>> a=[1,2,5,3,9,4,6,8,7,0,12]
>>> sorted(a)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 12]
>>> a
[1, 2, 5, 3, 9, 4, 6, 8, 7, 0, 12]

区别:

对于一个无序的列表a,调用a.sort(),对a进行排序后返回a,sort()函数修改待排序的列表内容。
而对于同样一个无序的列表a,调用sorted(a),对a进行排序后返回一个新的列表,而对a不产生影响。

示例2:

假设用元组保存每一个学生的信息,包括学号,姓名,年龄。用列表保存所有学生的信息。

>>> list1=[(8, 'Logan', 20), (2, 'Mike', 22), (5, 'Lucy', 19)]
>>> list1.sort()
>>> list1
[(2, 'Mike', 22), (5, 'Lucy', 19), (8, 'Logan', 20)]


>>> list1=[(8, 'Logan', 20), (2, 'Mike', 22), (5, 'Lucy', 19)]
>>> sorted(list1)
[(2, 'Mike', 22), (5, 'Lucy', 19), (8, 'Logan', 20)]
>>> list1
[(8, 'Logan', 20), (2, 'Mike', 22), (5, 'Lucy', 19)]

小结:由示例可以看出,当列表由list(或者tuple)组成时,默认情况下,sort和sorted都会根据list[0](或者tuple[0])作为排序的key,进行排序。

以上都是默认的排序方式,我们可以编写代码控制两个函数的排序行为。主要有三种方式:基于key函数;基于cmp函数和基于reverse函数

1)基于key函数排序

>>> list1=[(8, 'Logan', 20), (2, 'Mike', 22), (5, 'Lucy', 19)]
>>> list1.sort(key=lambda x:x[2])
>>> list1
[(5, 'Lucy', 19), (8, 'Logan', 20), (2, 'Mike', 22)]


>>> list1=[(8, 'Logan', 20), (2, 'Mike', 22), (5, 'Lucy', 19)]
>>> sorted(list1, key=lambda x:x[2])
[(5, 'Lucy', 19), (8, 'Logan', 20), (2, 'Mike', 22)]
>>> list1
[(8, 'Logan', 20), (2, 'Mike', 22), (5, 'Lucy', 19)]

2)基于cmp函数

>>> list1=[(8, 'Zogan', 20), (2, 'Mike', 22), (5, 'Lucy', 19)]
>>> list1.sort(cmp=lambda x,y:cmp(x[1],y[1]))
>>> list1
[(5, 'Lucy', 19), (2, 'Mike', 22), (8, 'Zogan', 20)]


>>> list1=[(8, 'Zogan', 20), (2, 'Mike', 22), (5, 'Lucy', 19)]
>>> sorted(list1, cmp=lambda x,y:cmp(x[1],y[1]))
[(5, 'Lucy', 19), (2, 'Mike', 22), (8, 'Zogan', 20)]
>>> list1
[(8, 'Zogan', 20), (2, 'Mike', 22), (5, 'Lucy', 19)]

3)基于reverse函数

>>> a=[1,2,5,3,9,4,6,8,7,0,12]
>>> a.sort(reverse=False)
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 12]
 

>>> a=[1,2,5,3,9,4,6,8,7,0,12]
>>> a.sort(reverse=True)
>>> a
[12, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
>>> a.sort(reverse=True)

小结:reverse=False为升序排序;reverse=True为降序排序

Python 相关文章推荐
python实现zencart产品数据导入到magento(python导入数据)
Apr 03 Python
在 Django/Flask 开发服务器上使用 HTTPS
Jul 03 Python
Python基于聚类算法实现密度聚类(DBSCAN)计算【测试可用】
Dec 26 Python
python根据txt文本批量创建文件夹
Dec 08 Python
python实现文本进度条 程序进度条 加载进度条 单行刷新功能
Jul 03 Python
Python PyInstaller库基本使用方法分析
Dec 12 Python
Python 使用threading+Queue实现线程池示例
Dec 21 Python
在keras中获取某一层上的feature map实例
Jan 24 Python
Python多线程多进程实例对比解析
Mar 12 Python
numpy中生成随机数的几种常用函数(小结)
Aug 18 Python
python在地图上画比例的实例详解
Nov 13 Python
Opencv python 图片生成视频的方法示例
Nov 18 Python
idea创建springMVC框架和配置小文件的教程图解
Sep 18 #Python
如何安装多版本python python2和python3共存以及pip共存
Sep 18 #Python
python2与python3共存问题的解决方法
Sep 18 #Python
Win10下python3.5和python2.7环境变量配置教程
Sep 18 #Python
Python global全局变量函数详解
Sep 18 #Python
Win10下python 2.7.13 安装配置方法图文教程
Sep 18 #Python
Python sorted函数详解(高级篇)
Sep 18 #Python
You might like
如何突破PHP程序员的技术瓶颈分析
2011/07/17 PHP
php计算一个文件大小的方法
2015/03/30 PHP
Json_decode 解析json字符串为NULL的解决方法(必看)
2017/02/17 PHP
php中通用的excel导出方法实例
2017/12/30 PHP
Yii框架连表查询操作示例
2019/09/06 PHP
JavaScript中为元素加上name属性的方法
2011/05/09 Javascript
面向对象的Javascript之三(封装和信息隐藏)
2012/01/27 Javascript
JS正则中的RegExp对象对象
2012/11/07 Javascript
滚动图片效果 jquery实现回旋滚动效果
2013/01/08 Javascript
jquery.post用法关于type设置问题补充
2014/01/03 Javascript
javascript 构造函数方式定义对象
2015/01/02 Javascript
JavaScript中利用jQuery绑定事件的几种方式小结
2016/03/06 Javascript
html判断当前页面是否在iframe中的实例
2016/11/30 Javascript
详解nodeJS中读写文件方法的区别
2017/03/06 NodeJs
基于vue.js实现的分页
2018/03/13 Javascript
原生JS实现列表子元素顺序反转的方法分析
2018/07/02 Javascript
ng-repeat指令在迭代对象时的去重方法
2018/10/02 Javascript
H5+css3+js搭建带验证码的登录页面
2020/10/11 Javascript
vue调用微信JSDK 扫一扫,相册等需要注意的事项
2021/01/03 Vue.js
[03:56]还原FTP电影首映式 DOTA2群星拼出遗迹世界
2014/03/26 DOTA
python实现超简单端口转发的方法
2015/03/13 Python
python生成器用法实例详解
2019/11/22 Python
python 遍历pd.Series的index和value
2019/11/26 Python
Python字符串、列表、元组、字典、集合的补充实例详解
2019/12/20 Python
将pytorch转成longtensor的简单方法
2020/02/18 Python
python logging.basicConfig不生效的原因及解决
2020/02/20 Python
TensorFlow2.1.0最新版本安装详细教程
2020/04/08 Python
JSP&Servlet技术面试题
2015/05/21 面试题
公司自我介绍演讲稿
2014/08/21 职场文书
学生会竞选演讲稿学习部
2014/08/25 职场文书
校运动会广播稿(100篇)
2014/09/12 职场文书
协商一致解除劳动合同协议书
2014/09/14 职场文书
区长工作作风个人整改措施
2014/10/01 职场文书
先进党支部申报材料
2014/12/24 职场文书
关于SpringBoot 使用 Redis 分布式锁解决并发问题
2021/11/17 Redis
PHP RabbitMQ消息列队
2022/05/11 PHP