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的Tkinter实现一个简易计算器
Dec 31 Python
python3利用smtplib通过qq邮箱发送邮件方法示例
Dec 03 Python
PyQt5每天必学之滑块控件QSlider
Apr 20 Python
python3+PyQt5实现自定义窗口部件Counters
Apr 20 Python
详解python调用cmd命令三种方法
Jul 08 Python
Python定时任务工具之APScheduler使用方式
Jul 24 Python
Python读写文件模式和文件对象方法实例详解
Sep 17 Python
opencv 查找连通区域 最大面积实例
Jun 04 Python
详解Selenium-webdriver绕开反爬虫机制的4种方法
Oct 28 Python
python中的yield from语法快速学习
Nov 06 Python
使用Python实现NBA球员数据查询小程序功能
Nov 09 Python
Python+Selenium自动化环境搭建与操作基础详解
Mar 13 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 保留小数点
2009/04/21 PHP
php debug 安装技巧
2011/04/30 PHP
php读取csv实现csv文件下载功能
2013/12/18 PHP
PHP实现的抓取小说网站内容功能示例
2019/06/27 PHP
Thinkphp 框架扩展之应用模式实现方法分析
2020/04/27 PHP
PHP实现简单注册登录系统
2020/12/28 PHP
TNC vs BOOM BO3 第一场2.13
2021/03/10 DOTA
基于jQuery捕获超链接事件进行局部刷新代码
2012/05/10 Javascript
JavaScript实现快速排序(自已编写)
2012/12/19 Javascript
转换字符串为json对象的方法详解
2013/11/29 Javascript
Javascript中的五种数据类型详解
2014/12/26 Javascript
巧用jQuery选择器提高写表单效率的方法
2016/08/19 Javascript
jquery删除数组中重复元素
2016/12/05 Javascript
ES6学习之变量的解构赋值
2017/02/12 Javascript
JS设置时间无效问题的解决办法
2017/02/18 Javascript
JavaScript关联数组用法分析【概念、定义、遍历】
2017/03/15 Javascript
vue与TypeScript集成配置最简教程(推荐)
2017/10/17 Javascript
详解Require.js与Sea.js的区别
2018/08/05 Javascript
微信小程序基于高德地图查找位置并显示文字
2019/10/30 Javascript
JS实现导航栏楼层特效
2020/01/01 Javascript
[02:12]探秘2016国际邀请赛中国区预选赛选手房间
2016/06/25 DOTA
[05:53]敌法师的金色冠名ID"BurNIng",是传说,是荣耀
2020/07/11 DOTA
Python定时执行之Timer用法示例
2015/05/27 Python
如何在sae中设置django,让sae的工作环境跟本地python环境一致
2017/11/21 Python
python自定义时钟类、定时任务类
2021/02/22 Python
Python简易版停车管理系统
2019/08/12 Python
Python实现Keras搭建神经网络训练分类模型教程
2020/06/12 Python
越南母婴用品购物网站:Kids Plaza
2020/04/09 全球购物
加拿大著名的奢侈品购物网站:SSENSE(支持中文)
2020/06/25 全球购物
体育教师自我鉴定
2014/02/12 职场文书
交通事故赔偿协议书范本
2014/04/15 职场文书
好的促销活动方案
2014/08/21 职场文书
模范班主任事迹材料
2014/12/17 职场文书
2014年社区卫生工作总结
2014/12/18 职场文书
安全学习心得体会范文
2016/01/18 职场文书
2016应届大学生自荐信模板
2016/01/28 职场文书