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 相关文章推荐
pygame学习笔记(2):画点的三种方法和动画实例
Apr 15 Python
Python常用的文件及文件路径、目录操作方法汇总介绍
May 21 Python
python实现的希尔排序算法实例
Jul 01 Python
对python mayavi三维绘图的实现详解
Jan 08 Python
让你Python到很爽的加速递归函数的装饰器
May 26 Python
python如何实现异步调用函数执行
Jul 08 Python
对Python中小整数对象池和大整数对象池的使用详解
Jul 09 Python
Python 中 -m 的典型用法、原理解析与发展演变
Nov 11 Python
Python解析多帧dicom数据详解
Jan 13 Python
keras获得model中某一层的某一个Tensor的输出维度教程
Jan 24 Python
Python MOCK SERVER moco模拟接口测试过程解析
Apr 13 Python
基于注解实现 SpringBoot 接口防刷的方法
Mar 02 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
从零开始 教你如何搭建Discuz!4.1论坛
2006/07/07 PHP
thinkPHP框架实现多表查询的方法
2018/06/14 PHP
showModelessDialog()使用详解
2006/09/21 Javascript
面向对象的javascript(笔记)
2009/10/06 Javascript
用Javascript同时提交多个Web表单的方法
2009/12/26 Javascript
JavaScript 开发规范要求(图文并茂)
2010/06/11 Javascript
js中的异常处理try...catch使用介绍
2013/09/21 Javascript
textarea焦点的用法实现获取焦点清空失去焦点提示效果
2014/05/19 Javascript
HTML5 Shiv完美解决IE(IE6/IE7/IE8)不兼容HTML5标签的方法
2015/11/25 Javascript
jQuery中使用animate自定义动画的方法
2016/05/29 Javascript
jQuery多级联动下拉插件chained用法示例
2016/08/20 Javascript
addEventListener()与removeEventListener()解析
2017/04/20 Javascript
原生js轮播特效
2017/05/18 Javascript
JavaScript实现获取用户单击body中所有A标签内容的方法
2017/06/05 Javascript
js Date()日期函数浏览器兼容问题解决方法
2017/09/12 Javascript
vue+高德地图写地图选址组件的方法
2019/05/18 Javascript
js判断鼠标移入移出方向的方法
2020/06/24 Javascript
使用Mock.js生成前端测试数据
2020/12/13 Javascript
python多重继承实例
2014/10/11 Python
Python实现通过文件路径获取文件hash值的方法
2017/04/29 Python
python里使用正则表达式的组嵌套实例详解
2017/10/24 Python
pyqt5简介及安装方法介绍
2018/01/31 Python
基于Python实现简单学生管理系统
2020/07/24 Python
Html5游戏开发之乒乓Ping Pong游戏示例(三)
2013/01/21 HTML / CSS
美国最大的家庭鞋类零售商之一:Shoe Carnival
2017/10/06 全球购物
allbeauty美国:英国在线美容店
2019/03/11 全球购物
意大利咖啡、浓缩咖啡和浓缩咖啡机:illy caffe
2019/03/20 全球购物
内刊编辑求职自荐书范文
2014/02/19 职场文书
俄语专业职业生涯规划
2014/02/26 职场文书
音乐教育感言
2014/03/05 职场文书
光信息科学与技术专业职业生涯规划
2014/03/13 职场文书
企业标语大全
2014/07/01 职场文书
工作证明英文模板
2014/10/21 职场文书
化验室岗位职责
2015/02/14 职场文书
my.ini优化mysql数据库性能的十个参数(推荐)
2021/05/26 MySQL
Nginx内网单机反向代理的实现
2021/11/07 Servers