python中sort和sorted排序的实例方法


Posted in Python onAugust 26, 2019

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

1)排序基础

简单的升序排序是非常容易的。只需要调用sorted()方法。它返回一个新的list,新的list的元素基于小于运算符(__lt__)来排序。

>>> sorted([5, 2, 3, 1, 4])
[1, 2, 3, 4, 5]

你也可以使用list.sort()方法来排序,此时list本身将被修改。通常此方法不如sorted()方便,但是如果你不需要保留原来的list,此方法将更有效。

>>> a = [5, 2, 3, 1, 4]
>>> a.sort()
>>> a
[1, 2, 3, 4, 5]

另一个不同就是list.sort()方法仅被定义在list中,相反地sorted()方法对所有的可迭代序列都有效。

>>> sorted({1: 'D', 2: 'B', 3: 'B', 4: 'E', 5: 'A'})
[1, 2, 3, 4, 5]

2)key参数/函数

从python2.4开始,list.sort()和sorted()函数增加了key参数来指定一个函数,此函数将在每个元素比较前被调用。 例如通过key指定的函数来忽略字符串的大小写:

>>> sorted("This is a test string from Andrew".split(), key=str.lower)
['a', 'Andrew', 'from', 'is', 'string', 'test', 'This']

key参数的值为一个函数,此函数只有一个参数且返回一个值用来进行比较。这个技术是快速的因为key指定的函数将准确地对每个元素调用。

更广泛的使用情况是用复杂对象的某些值来对复杂对象的序列排序,例如:

>>> student_tuples = [
    ('john', 'A', 15),
    ('jane', 'B', 12),
    ('dave', 'B', 10),
]
>>> sorted(student_tuples, key=lambda student: student[2])  # sort by age
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

同样的技术对拥有命名属性的复杂对象也适用,例如:

>>> class Student:
    def __init__(self, name, grade, age):
        self.name = name
        self.grade = grade
        self.age = age
    def __repr__(self):
        return repr((self.name, self.grade, self.age))
>>> student_objects = [
    Student('john', 'A', 15),
    Student('jane', 'B', 12),
    Student('dave', 'B', 10),
]
>>> sorted(student_objects, key=lambda student: student.age)  # sort by age
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

3)Operator 模块函数

上面的key参数的使用非常广泛,因此python提供了一些方便的函数来使得访问方法更加容易和快速。operator模块有itemgetter,attrgetter,从2.6开始还增加了methodcaller方法。使用这些方法,上面的操作将变得更加简洁和快速:

>>> from operator import itemgetter, attrgetter
>>> sorted(student_tuples, key=itemgetter(2))
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
>>> sorted(student_objects, key=attrgetter('age'))
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

operator模块还允许多级的排序,例如,先以grade,然后再以age来排序:

>>> sorted(student_tuples, key=itemgetter(1,2))
[('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]
>>> sorted(student_objects, key=attrgetter('grade', 'age'))
[('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]

4)升序和降序

list.sort()和sorted()都接受一个参数reverse(True or False)来表示升序或降序排序。例如对上面的student降序排序如下:

>>> sorted(student_tuples, key=itemgetter(2), reverse=True)
[('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
>>> sorted(student_objects, key=attrgetter('age'), reverse=True)
[('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]

5)排序的稳定性和复杂排序

从python2.2开始,排序被保证为稳定的。意思是说多个元素如果有相同的key,则排序前后他们的先后顺序不变。

>>> data = [('red', 1), ('blue', 1), ('red', 2), ('blue', 2)]
>>> sorted(data, key=itemgetter(0))
[('blue', 1), ('blue', 2), ('red', 1), ('red', 2)]

注意在排序后'blue'的顺序被保持了,即'blue', 1在'blue', 2的前面。

更复杂地你可以构建多个步骤来进行更复杂的排序,例如对student数据先以grade降序排列,然后再以age升序排列。

>>> s = sorted(student_objects, key=attrgetter('age'))   # sort on secondary key
>>> sorted(s, key=attrgetter('grade'), reverse=True)    # now sort on primary key, descending
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

以上就是本次介绍的全部实例知识点内容,感谢大家对三水点靠木的支持。

Python 相关文章推荐
数据挖掘之Apriori算法详解和Python实现代码分享
Nov 07 Python
python中lambda与def用法对比实例分析
Apr 30 Python
python实现闹钟定时播放音乐功能
Jan 25 Python
Python常见MongoDB数据库操作实例总结
Jul 24 Python
pyqt5 使用cv2 显示图片,摄像头的实例
Jun 27 Python
python绘制直方图和密度图的实例
Jul 08 Python
Linux下通过python获取本机ip方法示例
Sep 06 Python
用Python画小女孩放风筝的示例
Nov 23 Python
带你彻底搞懂python操作mysql数据库(cursor游标讲解)
Jan 06 Python
浅谈在django中使用filter()(即对QuerySet操作)时踩的坑
Mar 31 Python
Django-imagekit的使用详解
Jul 06 Python
Jupyter Notebook 远程访问配置详解
Jan 11 Python
对Python 中矩阵或者数组相减的法则详解
Aug 26 #Python
Numpy 中的矩阵求逆实例
Aug 26 #Python
利用python-docx模块写批量生日邀请函
Aug 26 #Python
在python Numpy中求向量和矩阵的范数实例
Aug 26 #Python
Python 如何提高元组的可读性
Aug 26 #Python
Python使用python-docx读写word文档
Aug 26 #Python
Python Subprocess模块原理及实例
Aug 26 #Python
You might like
PHP Pear 安装及使用
2009/03/19 PHP
php中的strpos使用示例
2014/02/27 PHP
thinkPHP3.1验证码的简单实现方法
2016/04/22 PHP
PHP判断一个变量是否为整数、正整数的方法示例
2019/09/11 PHP
JavaScript 题型问答有答案参考
2010/02/17 Javascript
jquery增加时编辑jqGrid(实例代码)
2013/11/08 Javascript
吐槽一下我所了解的Node.js
2014/10/08 Javascript
jQuery中dom元素上绑定的事件详解
2015/04/24 Javascript
javascript产生随机数方法汇总
2016/01/25 Javascript
JavaScript SHA-256加密算法详细代码
2016/10/06 Javascript
JS实现的系统调色板完整实例
2016/12/21 Javascript
Vue单页式应用(Hash模式下)实现微信分享的实例
2017/07/21 Javascript
详解js静态资源文件请求的处理
2017/08/01 Javascript
深入浅析js原型链和vue构造函数
2018/10/25 Javascript
Python smallseg分词用法实例分析
2015/05/28 Python
Python简单实现子网掩码转换的方法
2016/04/13 Python
Window 64位下python3.6.2环境搭建图文教程
2018/09/19 Python
在matplotlib的图中设置中文标签的方法
2018/12/13 Python
Python3实现的简单三级菜单功能示例
2019/03/12 Python
利用pyinstaller打包exe文件的基本教程
2019/05/02 Python
python pandas 时间日期的处理实现
2019/07/30 Python
Python自动生成代码 使用tkinter图形化操作并生成代码框架
2019/09/18 Python
解决python 读取excel时 日期变成数字并加.0的问题
2019/10/08 Python
Pytorch对Himmelblau函数的优化详解
2020/02/29 Python
PyQt5 控件字体样式等设置的实现
2020/05/13 Python
用python实现前向分词最大匹配算法的示例代码
2020/08/06 Python
深入研究HTML5实现图片压缩上传功能
2016/03/25 HTML / CSS
洛杉矶健身中心女性专用运动服饰品牌:Marika
2018/05/09 全球购物
Abbott Lyon官网:女士手表、珠宝及配件
2020/12/26 全球购物
亲子读书活动方案
2014/02/22 职场文书
工程材料采购方案
2014/05/18 职场文书
公务员培的训心得体会
2014/09/01 职场文书
三方股份合作协议书
2014/10/13 职场文书
2014年妇幼卫生工作总结
2014/12/09 职场文书
2016年党建工作简报
2015/11/26 职场文书
2021年国产动漫公司排行前十名,玄机科技上榜,第二推出过铠甲勇士
2022/03/18 杂记