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 splitlines使用技巧
Sep 06 Python
python strip()函数 介绍
May 24 Python
python使用socket进行简单网络连接的方法
Apr 29 Python
初学python的操作难点总结(新手必看篇)
Aug 03 Python
Python打包模块wheel的使用方法与将python包发布到PyPI的方法详解
Feb 12 Python
python使用docx模块读写docx文件的方法与docx模块常用方法详解
Feb 17 Python
ubuntu 安装pyqt5和卸载pyQt5的方法
Mar 24 Python
Python request操作步骤及代码实例
Apr 13 Python
Python内置函数locals和globals对比
Apr 28 Python
利用python实现平稳时间序列的建模方式
Jun 03 Python
Python常驻任务实现接收外界参数代码解析
Jul 21 Python
Python Request类源码实现方法及原理解析
Aug 17 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
phpfans留言版用到的数据操作类和分页类
2007/01/04 PHP
解决中英文字符串长度问题函数
2007/01/16 PHP
php面向对象的方法重载两种版本比较
2008/09/08 PHP
PHP防止注入攻击实例分析
2014/11/03 PHP
php+Mysqli利用事务处理转账问题实例
2015/02/11 PHP
Laravel下生成验证码的类
2017/11/15 PHP
js继承的实现代码
2010/08/05 Javascript
JavaScript高级程序设计 XML、Ajax 学习笔记
2011/09/10 Javascript
深入理解JavaScript是如何实现继承的
2013/12/12 Javascript
js判断横竖屏及禁止浏览器滑动条示例
2014/04/29 Javascript
基于JavaScript代码实现随机漂浮图片广告
2016/01/05 Javascript
Angularjs全局变量被作用域监听的正确姿势
2016/02/06 Javascript
分享一个原生的JavaScript拖动方法
2016/09/25 Javascript
vue脚手架vue-cli的学习使用教程
2017/06/06 Javascript
JS失效 提示HTML1114: (UNICODE 字节顺序标记)的代码页 utf-8 覆盖(META 标记)的冲突的代码页 utf-8
2017/06/23 Javascript
vue.js $refs和$emit 父子组件交互的方法
2017/12/20 Javascript
使用layer弹窗和layui表单实现新增功能
2018/08/09 Javascript
ES6基础之展开语法(Spread syntax)
2019/02/21 Javascript
[00:33]DOTA2上海特级锦标赛 CDEC战队宣传片
2016/03/04 DOTA
python实现下载整个ftp目录的方法
2017/01/17 Python
python3获取两个日期之间所有日期,以及比较大小的实例
2018/04/08 Python
解决Python下json.loads()中文字符出错的问题
2018/12/19 Python
python 检查是否为中文字符串的方法
2018/12/28 Python
Python+OpenCV采集本地摄像头的视频
2019/04/25 Python
Python代码实现http/https代理服务器的脚本
2019/08/12 Python
python中如何实现将数据分成训练集与测试集的方法
2019/09/13 Python
Python多线程Threading、子线程与守护线程实例详解
2020/03/24 Python
HTML5不支持标签和新增标签详解
2016/06/27 HTML / CSS
PHP经典面试题
2016/09/03 面试题
保安拾金不昧表扬信
2014/01/15 职场文书
低碳日宣传活动总结
2014/07/09 职场文书
2015年学生会纪检部工作总结
2015/03/31 职场文书
标枪加油稿
2015/07/22 职场文书
三严三实学习心得体会(精选N篇)
2016/01/05 职场文书
javaScript Array api梳理
2021/03/31 Javascript
基于Redission的分布式锁实战
2022/08/14 Redis