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 pickle模块用法实例分析
May 27 Python
利用Python学习RabbitMQ消息队列
Nov 30 Python
Python操作MongoDB详解及实例
May 18 Python
python实现多线程行情抓取工具的方法
Feb 28 Python
Python使用ConfigParser模块操作配置文件的方法
Jun 29 Python
flask中的wtforms使用方法
Jul 21 Python
Flask框架配置与调试操作示例
Jul 23 Python
Python实现App自动签到领取积分功能
Sep 29 Python
Python_查看sqlite3表结构,查询语句的示例代码
Jul 17 Python
Python Django view 两种return的实现方式
Mar 16 Python
Python爬虫之自动爬取某车之家各车销售数据
Jun 02 Python
python使用opencv对图像添加噪声(高斯/椒盐/泊松/斑点)
Apr 06 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
global.php
2006/12/09 PHP
javascript replace方法与正则表达式
2008/02/19 Javascript
关于JavaScript的一些看法
2009/05/27 Javascript
多浏览器支持的右下角浮动窗口
2010/04/01 Javascript
JavaScript子窗口ModalDialog中操作父窗口对像
2012/12/11 Javascript
JS解析json数据并将json字符串转化为数组的实现方法
2012/12/25 Javascript
Javascript中arguments和arguments.callee的区别浅析
2015/04/24 Javascript
javascript事件模型介绍
2016/05/31 Javascript
jQuery easyui刷新当前tabs的方法
2016/09/23 Javascript
JS获取html元素的标记名实现方法
2016/10/08 Javascript
jquery.validate表单验证插件使用方法解析
2016/11/07 Javascript
Bootstrap CSS布局之代码
2016/12/17 Javascript
angular中实现控制器之间传递参数的方式
2017/04/24 Javascript
解决vue里碰到 $refs 的问题的方法
2017/07/13 Javascript
分享Bootstrap简单表格、表单、登录页面
2017/08/04 Javascript
Node.js五大应用性能技巧小结(必须收藏)
2017/08/09 Javascript
简单谈谈关于Angular Cli打包的事
2017/09/05 Javascript
360提示[高危]使用存在漏洞的JQuery版本的解决方法
2017/10/27 jQuery
vue addRoutes实现动态权限路由菜单的示例
2018/05/15 Javascript
Webpack3+React16代码分割的实现
2021/03/03 Javascript
Python中的startswith和endswith函数使用实例
2014/08/25 Python
Python中装饰器的一个妙用
2015/02/08 Python
python通过yield实现数组全排列的方法
2015/03/18 Python
python中黄金分割法实现方法
2015/05/06 Python
python爬取微信公众号文章
2018/08/31 Python
python实现爬取百度图片的方法示例
2019/07/06 Python
css3的动画特效之动画序列(animation)
2017/12/22 HTML / CSS
Bowflex美国官方网站:高级家庭健身器材
2017/12/22 全球购物
美国LOGO设计公司:The Logo Company
2018/07/16 全球购物
印尼极简主义和实惠的在线家具店:Fabelio
2019/03/27 全球购物
关键字throw与throws的用法差异
2016/11/22 面试题
公务员党员评议表自我鉴定
2014/09/14 职场文书
幼儿教师师德师风自我剖析材料
2014/09/29 职场文书
MySQL数据迁移相关总结
2021/04/29 MySQL
Python实现科学占卜 让视频自动打码
2022/04/09 Python
三种方式清除vue路由跳转router-link的历史记录
2022/04/10 Vue.js