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中根据字符串调用函数的实现方法
Jun 12 Python
如何利用Fabric自动化你的任务
Oct 20 Python
python 如何快速找出两个电子表中数据的差异
May 26 Python
Python自然语言处理之词干,词形与最大匹配算法代码详解
Nov 16 Python
python 实现一次性在文件中写入多行的方法
Jan 28 Python
Python连接Oracle之环境配置、实例代码及报错解决方法详解
Feb 11 Python
python读取多层嵌套文件夹中的文件实例
Feb 27 Python
Python的in,is和id函数代码实例
Apr 18 Python
Python openpyxl模块实现excel读写操作
Jun 30 Python
Python如何实现大型数组运算(使用NumPy)
Jul 24 Python
PIP和conda 更换国内安装源的方法步骤
Sep 21 Python
Pandas-DataFrame知识点汇总
Mar 16 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 缓存实现代码及详细注释
2010/05/16 PHP
php页面缓存ob系列函数介绍
2012/10/18 PHP
ThinkPHP实现简单登陆功能
2017/04/28 PHP
模仿JQuery sortable效果 代码有错但值得看看
2009/11/05 Javascript
Ext对基本类型的扩展 ext,extjs,format
2010/12/25 Javascript
基于jquery的无缝循环新闻列表插件
2011/03/07 Javascript
利用jQuery接受和处理xml数据的代码(.net)
2011/03/28 Javascript
JavaScript中清空数组的三种方法分享
2011/04/07 Javascript
node.js WEB开发中图片验证码的实现方法
2014/06/03 Javascript
解决js页面滚动效果scrollTop在FireFox与Chrome浏览器间的兼容问题的方法
2015/12/03 Javascript
Three.js利用dat.GUI如何简化试验流程详解
2017/09/26 Javascript
Express的HTTP重定向到HTTPS的方法
2018/06/06 Javascript
基于JavaScript实现每日签到打卡轨迹功能
2018/11/29 Javascript
创建Vue项目以及引入Iview的方法示例
2018/12/03 Javascript
JS实现水平遍历和嵌套递归操作示例
2019/08/15 Javascript
node 解析图片二维码的内容代码实例
2019/09/11 Javascript
vue设置动态请求地址的例子
2019/11/01 Javascript
详细解读Python的web.py框架下的application.py模块
2015/05/02 Python
python用pickle模块实现“增删改查”的简易功能
2017/06/07 Python
对python中array.sum(axis=?)的用法介绍
2018/06/28 Python
20行python代码的入门级小游戏的详解
2019/05/05 Python
如何基于Python批量下载音乐
2019/11/11 Python
pygame库实现移动底座弹球小游戏
2020/04/14 Python
python opencv实现信用卡的数字识别
2020/01/12 Python
捷克建筑材料网上商店:DEK.cz
2021/03/06 全球购物
北大研究生linux应用求职信
2013/10/29 职场文书
职业教育毕业生求职信
2013/11/09 职场文书
外贸业务员的岗位职责
2013/11/23 职场文书
高中的自我鉴定
2013/12/16 职场文书
先进事迹报告会感言
2014/01/24 职场文书
聚美优品励志广告词
2014/03/14 职场文书
商场租赁意向书
2014/07/30 职场文书
群众路线教育实践活动学习心得体会
2014/10/30 职场文书
爱国主义教育基地观后感
2015/06/18 职场文书
《一面五星红旗》教学反思
2016/02/23 职场文书
详解OpenCV获取高动态范围(HDR)成像
2022/04/29 Python