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基于twisted实现简单的web服务器
Sep 29 Python
python3实现windows下同名进程监控
Jun 21 Python
python模拟登陆,用session维持回话的实例
Dec 27 Python
python-itchat 统计微信群、好友数量,及原始消息数据的实例
Feb 21 Python
Python eval的常见错误封装及利用原理详解
Mar 26 Python
python使用paramiko模块通过ssh2协议对交换机进行配置的方法
Jul 25 Python
python如何将两个txt文件内容合并
Oct 18 Python
Python动态导入模块和反射机制详解
Feb 18 Python
python实现五子棋程序
Apr 24 Python
Django之富文本(获取内容,设置内容方式)
May 21 Python
python时间time模块处理大全
Oct 25 Python
python编程简单几行代码实现视频转换Gif示例
Oct 05 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处理json时中文问题的解决方法
2011/04/12 PHP
yii框架源码分析之创建controller代码
2011/06/28 PHP
php中多维数组按指定value排序的实现代码
2014/08/19 PHP
php生成网页桌面快捷方式
2017/05/05 PHP
php7函数,声明,返回值等新特性介绍
2018/05/25 PHP
JQuery 表单中textarea字数限制实现代码
2009/12/07 Javascript
javascript 用记忆函数快速计算递归函数
2010/03/15 Javascript
深入理解javascript中return的作用
2013/12/30 Javascript
input禁止键盘及中文输入,但可以点击
2014/02/13 Javascript
jQuery实现隔行背景色变色
2014/11/24 Javascript
jQuery实现鼠标划过修改样式的方法
2015/04/14 Javascript
win7下安装配置node.js+express开发环境
2015/12/06 Javascript
Node.js环境下Koa2添加travis ci持续集成工具的方法
2017/06/19 Javascript
浅谈Vue.js中的v-on(事件处理)
2017/09/05 Javascript
详解开源的JavaScript插件化框架MinimaJS
2017/10/26 Javascript
Vue组件库发布到npm详解
2018/02/17 Javascript
小程序中使用css var变量(使js可以动态设置css样式属性)
2020/03/31 Javascript
浅谈vue项目,访问路径#号的问题
2020/08/14 Javascript
python实现井字棋游戏
2020/03/30 Python
python学习之面向对象【入门初级篇】
2017/01/21 Python
Python采集猫眼两万条数据 对《无名之辈》影评进行分析
2018/12/05 Python
钉钉群自定义机器人消息Python封装的实例
2019/02/20 Python
flask框架渲染Jinja模板与传入模板变量操作详解
2020/01/25 Python
keras 指定程序在某块卡上训练实例
2020/06/22 Python
python中温度单位转换的实例方法
2020/12/27 Python
pycharm 复制代码出现空格的解决方式
2021/01/15 Python
ghd法国官方网站:英国最受欢迎的美发工具品牌
2019/04/18 全球购物
日本最大的彩色隐形眼镜销售网站:CharmColor
2020/09/09 全球购物
建筑工地质量标语
2014/06/12 职场文书
学籍证明模板
2014/11/21 职场文书
死亡赔偿协议书
2015/01/28 职场文书
2015年安全生产月工作总结
2015/07/27 职场文书
行为规范主题班会
2015/08/13 职场文书
《月球之谜》教学反思
2016/02/20 职场文书
使用PDF.js渲染canvas实现预览pdf的效果示例
2021/04/17 Javascript
如何使用pdb进行Python调试
2021/06/30 Python