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函数缺省值与引用学习笔记分享
Feb 10 Python
使用Python脚本来控制Windows Azure的简单教程
Apr 16 Python
python实现多线程抓取知乎用户
Dec 12 Python
Python爬虫实例扒取2345天气预报
Mar 04 Python
Python 动态导入对象,importlib.import_module()的使用方法
Aug 28 Python
Ranorex通过Python将报告发送到邮箱的方法
Jan 12 Python
Python 字节流,字符串,十六进制相互转换实例(binascii,bytes)
May 11 Python
如何从csv文件构建Tensorflow的数据集
Sep 21 Python
python实现文件+参数发送request的实例代码
Jan 05 Python
python中HTMLParser模块知识点总结
Jan 25 Python
Python还能这么玩之只用30行代码从excel提取个人值班表
Jun 05 Python
python实现局部图像放大
Nov 17 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
无线电波是什么?它是怎样传输的?
2021/03/01 无线电
JSON PHP中,Json字符串反序列化成对象/数组的方法
2018/05/31 PHP
showModalDialog 和 showModelessDialog
2007/01/22 Javascript
关闭浏览器时提示onbeforeunload事件
2013/12/25 Javascript
JavaScript Serializer序列化时间处理示例
2014/07/31 Javascript
node.js中的fs.fchmod方法使用说明
2014/12/16 Javascript
Js使用WScript.Shell对象执行.bat文件和cmd命令
2014/12/18 Javascript
JQuery动画与特效实例分析
2015/02/02 Javascript
javascript实现炫酷的拖动分页
2015/05/11 Javascript
jQuery点击改变class并toggle及toggleClass()方法定义用法
2015/12/11 Javascript
Vue常用指令V-model用法
2017/03/08 Javascript
Vue项目组件化工程开发实践方案
2018/01/09 Javascript
vue使用原生js实现滚动页面跟踪导航高亮的示例代码
2018/10/25 Javascript
Node.JS用纯JavaScript生成图片或滑块式验证码功能
2019/09/12 Javascript
js实现淘宝浏览商品放大镜功能
2020/10/28 Javascript
nodejs处理tcp连接的核心流程
2021/02/26 NodeJs
[42:24]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第三场 11.27
2020/12/01 DOTA
videocapture库制作python视频高速传输程序
2013/12/23 Python
Python有序查找算法之二分法实例分析
2017/12/11 Python
pandas apply 函数 实现多进程的示例讲解
2018/04/20 Python
Python用于学习重要算法的模块pygorithm实例浅析
2018/08/16 Python
python web自制框架之接受url传递过来的参数实例
2018/12/17 Python
python实现银行管理系统
2019/10/25 Python
pycharm新建Vue项目的方法步骤(图文)
2020/03/04 Python
基于django 的orm中非主键自增的实现方式
2020/05/18 Python
使用tensorflow进行音乐类型的分类
2020/08/14 Python
python如何写个俄罗斯方块
2020/11/06 Python
彻底解决pip下载pytorch慢的问题方法
2021/03/01 Python
您附近的水疗和健康场所:Spafinder(美国)
2019/07/05 全球购物
俄罗斯达美乐比萨外送服务:Domino’s Pizza
2020/12/18 全球购物
法学专业毕业生自荐信
2014/06/11 职场文书
党的群众路线教育实践活动个人对照检查材料范文
2014/09/25 职场文书
整改报告怎么写
2014/11/06 职场文书
合作合同协议书范本
2015/01/27 职场文书
英语通知范文
2015/04/22 职场文书
2016年教师节特级教师获奖感言
2015/12/09 职场文书