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 相关文章推荐
Python性能提升之延迟初始化
Dec 04 Python
Python中第三方库Requests库的高级用法详解
Mar 12 Python
每天迁移MySQL历史数据到历史库Python脚本
Apr 13 Python
python利用smtplib实现QQ邮箱发送邮件
May 20 Python
详解Django中间件的5种自定义方法
Jul 26 Python
用Python实现筛选文件脚本的方法
Oct 27 Python
3分钟学会一个Python小技巧
Nov 23 Python
Django项目创建到启动详解(最全最详细)
Sep 07 Python
python实现图片插入文字
Nov 26 Python
Python多线程threading join和守护线程setDeamon原理详解
Mar 18 Python
详解Python中pyautogui库的最全使用方法
Apr 01 Python
python将unicode和str互相转化的实现
May 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的单引号和双引号 字符串效率
2009/05/27 PHP
基于PHP输出缓存(output_buffering)的深入理解
2013/06/13 PHP
php 根据url自动生成缩略图并处理高并发问题
2014/01/23 PHP
zf框架的校验器使用使用示例(自定义校验器和校验器链)
2014/03/13 PHP
ThinkPHP的Widget扩展实例
2014/06/19 PHP
Yii实现MySQL多数据库和读写分离实例分析
2014/12/03 PHP
PHP给文字内容中的关键字进行套红处理
2016/04/12 PHP
yii2超好用的日期组件和时间组件
2016/05/05 PHP
JQuery 应用 JQuery.groupTable.js
2010/12/15 Javascript
Ubuntu 11.10 安装Node.js的方法
2011/11/30 Javascript
onmouseover和onmouseout的一些问题思考
2013/08/14 Javascript
jquery实现按Enter键触发事件示例
2013/09/10 Javascript
JS仿iGoogle自定义首页模块拖拽特效的方法
2015/02/13 Javascript
jQuery实现自定义checkbox和radio样式
2015/07/13 Javascript
JavaScript实现下拉列表框数据增加、删除、上下排序的方法
2015/08/11 Javascript
JS简单去除数组中重复项的方法
2016/09/13 Javascript
HTML5 JS压缩图片并获取图片BASE64编码上传
2020/11/16 Javascript
基于javascript实现按圆形排列DIV元素(二)
2016/12/02 Javascript
ionic中的$ionicPlatform.ready事件中的通用设置
2017/06/11 Javascript
前端跨域的几种解决方式总结(推荐)
2017/08/16 Javascript
详解解决使用axios发送json后台接收不到的问题
2018/06/27 Javascript
浅谈layer弹出层按钮颜色修改方法
2019/09/11 Javascript
在Django的模板中使用认证数据的方法
2015/07/23 Python
Python编程判断这天是这一年第几天的方法示例
2017/04/18 Python
同时安装Python2 & Python3 cmd下版本自由选择的方法
2017/12/09 Python
详解python之heapq模块及排序操作
2019/04/04 Python
Pycharm如何打断点的方法步骤
2019/06/13 Python
基于python3监控服务器状态进行邮件报警
2019/10/19 Python
Python实现捕获异常发生的文件和具体行数
2020/04/25 Python
HTML5中图片之间的缝隙完美解决方法
2017/07/07 HTML / CSS
世界顶级俱乐部的官方球衣和套装:Subside Sports
2018/04/22 全球购物
FC-Moto英国:欧洲最大的摩托车服装和头盔商店之一
2019/08/25 全球购物
网络信息管理员岗位职责
2014/01/05 职场文书
品牌转让协议书
2014/08/20 职场文书
工伤调解协议书
2016/03/21 职场文书
读《工匠精神》有感:热爱工作,精益求精
2019/12/28 职场文书