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性能提升之延迟初始化
Dec 04 Python
浅谈django orm 优化
Aug 18 Python
Django 限制用户访问频率的中间件的实现
Aug 23 Python
python ftp 按目录结构上传下载的实现代码
Sep 12 Python
python 用for循环实现1~n求和的实例
Feb 01 Python
Python实现 版本号对比功能的实例代码
Apr 18 Python
Python接口测试数据库封装实现原理
May 09 Python
没编程基础可以学python吗
Jun 17 Python
python里的单引号和双引号的有什么作用
Jun 17 Python
使用numpy实现矩阵的翻转(flip)与旋转
Jun 03 Python
Python下opencv库的安装过程及问题汇总
Jun 11 Python
Python数据可视化之Seaborn的安装及使用
Apr 19 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 Smarty模板生成html文档的方法
2010/04/12 PHP
关于更改Zend Studio/Eclipse代码风格主题的介绍
2013/06/23 PHP
PHP中余数、取余的妙用
2015/06/29 PHP
PHP常见漏洞攻击分析
2016/02/21 PHP
PHP实现登录搜狐广告获取广告联盟数据的方法【附demo源码】
2016/10/14 PHP
php5.3后静态绑定用法详解
2016/11/11 PHP
YII框架中搜索分页jQuery写法详解
2016/12/19 PHP
解决laravel 表单提交-POST 异常的问题
2019/10/15 PHP
将HTML自动转为JS代码
2006/06/26 Javascript
JS网络游戏-(模拟城市webgame)提供的一些例子下载
2007/10/14 Javascript
FireFox与IE 下js兼容触发click事件的代码
2008/11/20 Javascript
jquery ready函数源代码研究
2009/12/06 Javascript
JavaScript toFixed() 方法
2010/04/15 Javascript
jQuery技巧总结
2011/01/01 Javascript
用正则表达式替换图片地址img标签
2013/11/22 Javascript
js捕获鼠标滚轮事件代码
2013/12/16 Javascript
JS动态改变浏览器标题的方法
2016/04/06 Javascript
setTimeout学习小结
2017/02/08 Javascript
初学者AngularJS的环境搭建过程
2017/10/27 Javascript
解决vue-router中的query动态传参问题
2018/03/20 Javascript
JavaScript中继承原理与用法实例入门
2020/05/09 Javascript
Python 字典(Dictionary)操作详解
2014/03/11 Python
python使用xlrd模块读写Excel文件的方法
2015/05/06 Python
python2.7实现FTP文件下载功能
2018/04/15 Python
python保存网页图片到本地的方法
2018/07/24 Python
解决pytorch GPU 计算过程中出现内存耗尽的问题
2019/08/19 Python
django创建css文件夹的具体方法
2020/07/31 Python
如何利用python之wxpy模块玩转微信
2020/08/17 Python
Python requests上传文件实现步骤
2020/09/15 Python
英国最专业的健身器材供应商之一:Best Gym Equipment
2017/12/22 全球购物
早晨薰衣草在线女性精品店:Morning Lavender
2021/01/04 全球购物
Java程序开发中如何应用线程
2016/03/03 面试题
《中国的气候》教学反思
2014/02/23 职场文书
2015年大学宣传部工作总结
2015/05/26 职场文书
Python 全局空间和局部空间
2022/04/06 Python
修改Nginx配置返回指定content-type的方法
2022/09/23 Servers