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 相关文章推荐
Python3中常用的处理时间和实现定时任务的方法的介绍
Apr 07 Python
Python使用pygame模块编写俄罗斯方块游戏的代码实例
Dec 08 Python
Python安装模块的常见问题及解决方法
Feb 05 Python
Python中列表与元组的乘法操作示例
Feb 10 Python
python matplotlib绘图,修改坐标轴刻度为文字的实例
May 25 Python
对python中for、if、while的区别与比较方法
Jun 25 Python
Python 给屏幕打印信息加上颜色的实现方法
Apr 24 Python
Python+OpenCV实现实时眼动追踪的示例代码
Nov 11 Python
python数据预处理 :数据抽样解析
Feb 24 Python
Python-split()函数实例用法讲解
Dec 18 Python
如何用python 操作zookeeper
Dec 28 Python
python实现KNN近邻算法
Dec 30 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-CGI进程CPU 100% 与 file_get_contents 函数的关系分析
2011/08/15 PHP
php_pdo 预处理语句详解
2016/11/21 PHP
Laravel模型间关系设置分表的方法示例
2018/04/21 PHP
PHP xpath提取网页数据内容代码解析
2020/07/16 PHP
OfflineSave离线保存代码再次发布使用说明
2007/05/23 Javascript
javascript之解决IE下不渲染的bug
2007/06/29 Javascript
jQuery 表单验证扩展(三)
2010/10/20 Javascript
php 中序列化和json使用介绍
2013/07/08 Javascript
javascript中sort()的用法实例分析
2015/01/30 Javascript
jquery带翻页动画的电子杂志代码分享
2015/08/21 Javascript
跟我学习javascript的闭包
2015/11/16 Javascript
JavaScript+html5 canvas制作色彩斑斓的正方形效果
2016/01/27 Javascript
学习javascript文件加载优化
2016/02/19 Javascript
基于对象合并功能的实现示例
2017/10/10 Javascript
JS简单实现数组去重的方法分析
2017/10/14 Javascript
vue实现选项卡及选项卡切换效果
2018/04/24 Javascript
详解jQuery获取特殊属性的值以及设置内容
2018/11/14 jQuery
详解JavaScript 新语法之Class 的私有属性与私有方法
2019/04/23 Javascript
vue+element创建动态的form表单及动态生成表格的行和列
2019/05/20 Javascript
JavaScript设计模式---单例模式详解【四种基本形式】
2020/05/16 Javascript
Vue自定义render统一项目组弹框功能
2020/06/07 Javascript
使用Python进行新浪微博的mid和url互相转换实例(10进制和62进制互算)
2014/04/25 Python
详解Python3.1版本带来的核心变化
2015/04/07 Python
Python操作mysql数据库实现增删查改功能的方法
2018/01/15 Python
python登录WeChat 实现自动回复实例详解
2019/05/28 Python
Python学习笔记基本数据结构之序列类型list tuple range用法分析
2019/06/08 Python
Pandas+Matplotlib 箱式图异常值分析示例
2019/12/09 Python
解决pytorch 的state_dict()拷贝问题
2021/03/03 Python
html5的canvas元素使用方法介绍(画矩形、画折线、圆形)
2014/04/14 HTML / CSS
美国特价机票专家:Airfarewatchdog
2018/01/24 全球购物
12.4法制宣传日标语
2014/10/08 职场文书
合法的离婚协议书范本
2014/10/23 职场文书
综合测评自我评价
2015/03/06 职场文书
神秘岛读书笔记
2015/07/01 职场文书
保险公司增员口号
2015/12/25 职场文书
初三化学教学反思
2016/02/22 职场文书