python中List的sort方法指南


Posted in Python onSeptember 01, 2014

简单记一下python中List的sort方法(或者sorted内建函数)的用法。 

List的元素可以是各种东西,字符串,字典,自己定义的类等。

sorted函数用法如下:

sorted(data, cmp=None, key=None, reverse=False) 

其中,data是待排序数据,可以使List或者iterator, cmp和key都是函数,这两个函数作用与data的元素上产生一个结果,sorted方法根据这个结果来排序。

cmp(e1, e2) 是带两个参数的比较函数, 返回值: 负数: e1 < e2, 0: e1 == e2, 正数: e1 > e2. 默认为 None, 即用内建的比较函数.
key 是带一个参数的函数, 用来为每个元素提取比较值. 默认为 None, 即直接比较每个元素.
通常, key 和 reverse 比 cmp 快很多, 因为对每个元素它们只处理一次; 而 cmp 会处理多次.

通过例子来说明sorted的用法:

1. 对由tuple组成的List排序

>>> students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10),]

用key函数排序(lambda的用法见 注释1)

>>> sorted(students, key=lambda student : student[2])  # sort by age 
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

用cmp函数排序

>>> sorted(students, cmp=lambda x,y : cmp(x[2], y[2])) # sort by age 
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

用 operator 函数来加快速度, 上面排序等价于:(itemgetter的用法见 注释2)

>>> from operator import itemgetter, attrgetter 
>>> sorted(students, key=itemgetter(2))

用 operator 函数进行多级排序

>>> sorted(students, key=itemgetter(1,2)) # sort by grade then by age 
[('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]

2. 对由字典排序

>>> d = {'data1':3, 'data2':1, 'data3':2, 'data4':4} 
>>> sorted(d.iteritems(), key=itemgetter(1), reverse=True) 
[('data4', 4), ('data1', 3), ('data3', 2), ('data2', 1)]

注释1
参考:http://jasonwu.me/2011/10/29/introduce-to-python-lambda.html

注释2
参考:http://ar.newsmth.net/thread-90745710c90cf1.html

class itemgetter(__builtin__.object) 
| itemgetter(item, ...) --> itemgetter object 
| 
| Return a callable object that fetches the given item(s) from its operand. 
| After, f=itemgetter(2), the call f(r) returns r[2]. 
| After, g=itemgetter(2,5,3), the call g(r) returns (r[2], r[5], r[3])

相当于

def itemgetter(i,*a):  
  def func(obj):  
    r = obj[i]  
    if a:  
      r = (r,) + tuple(obj[i] for i in a)  
    return r  
  return func  
 
>>> a = [1,2,3]  
>>> b=operator.itemgetter(1)  
>>> b(a)  
2  
>>> b=operator.itemgetter(1,0)  
>>> b(a)  
(2, 1)  
>>> b=itemgetter(1)  
>>> b(a)  
2  
>>> b=itemgetter(1,0)  
>>> b(a)  
(2, 1)

参考资料:
1. http://www.linuxso.com/linuxbiancheng/13340.html
2. http://www.douban.com/note/13460891/

Python 相关文章推荐
python 实现归并排序算法
Jun 05 Python
Python求解平方根的方法
Mar 11 Python
python requests 测试代理ip是否生效
Jul 25 Python
深度辨析Python的eval()与exec()的方法
Mar 26 Python
python简单鼠标自动点击某区域的实例
Jun 25 Python
简单了解python 邮件模块的使用方法
Jul 24 Python
python字符串替换re.sub()方法解析
Sep 18 Python
Pycharm 2019 破解激活方法图文详解
Oct 11 Python
django实现web接口 python3模拟Post请求方式
Nov 19 Python
python3连接MySQL8.0的两种方式
Feb 17 Python
python数据库操作mysql:pymysql、sqlalchemy常见用法详解
Mar 30 Python
详解Python3 定义一个跨越多行的字符串的多种方法
Sep 06 Python
Python抓取京东图书评论数据
Aug 31 #Python
Python深入学习之内存管理
Aug 31 #Python
Python深入学习之装饰器
Aug 31 #Python
Python深入学习之闭包
Aug 31 #Python
Python深入学习之对象的属性
Aug 31 #Python
Python深入学习之上下文管理器
Aug 31 #Python
Python深入学习之特殊方法与多范式
Aug 31 #Python
You might like
ThinkPHP中关联查询实例
2014/12/02 PHP
PHP防止图片盗用(盗链)的方法小结
2016/11/11 PHP
php正则表达式基本知识与应用详解【经典教程】
2017/04/17 PHP
php7 错误处理机制修改实例分析
2020/05/25 PHP
奇妙的js
2007/09/24 Javascript
javascript 命名空间以提高代码重用性
2008/11/13 Javascript
E3 tree 1.6在Firefox下显示问题的修复方法
2013/01/30 Javascript
HTML5之lang属性与dir属性的详解
2013/06/19 Javascript
JS脚本defer的作用示例介绍
2014/01/02 Javascript
jQuery checkbox选中问题之prop与attr注意点分析
2016/11/15 Javascript
JS定时检测任务任务完成后执行下一步的解决办法
2016/12/22 Javascript
JS仿JQuery选择器功能
2017/03/08 Javascript
ES6入门教程之let和const命令详解
2017/05/17 Javascript
jquery自定义显示消息数量
2017/12/19 jQuery
vue2.0项目实现路由跳转的方法详解
2018/06/21 Javascript
js 实现在2d平面上画8的方法
2018/10/10 Javascript
vue axios重复点击取消上一次请求封装的方法
2019/06/19 Javascript
layui实现数据表格table分页功能(ajax异步)
2019/07/27 Javascript
详细分析JavaScript中的深浅拷贝
2020/09/17 Javascript
[10:53]2018DOTA2国际邀请赛寻真——EG
2018/08/11 DOTA
python动态性强类型用法实例
2015/05/09 Python
十条建议帮你提高Python编程效率
2016/02/16 Python
Python科学计算之NumPy入门教程
2017/01/15 Python
Python实现端口检测的方法
2018/07/24 Python
flask-socketio实现WebSocket的方法
2018/07/31 Python
在python中获取div的文本内容并和想定结果进行对比详解
2019/01/02 Python
详解Python函数式编程—高阶函数
2019/03/29 Python
python 实现仿微信聊天时间格式化显示的代码
2020/04/17 Python
白俄罗斯女装和针织品网上商店:Presli.by
2019/10/13 全球购物
2014年社区党建工作汇报材料
2014/11/02 职场文书
2015年度学校卫生工作总结
2015/05/12 职场文书
学籍证明模板
2015/06/18 职场文书
老人与海读书笔记
2015/06/26 职场文书
岗位聘任协议书
2015/09/21 职场文书
【海涛解说】史上最给力比赛,挑战DOTA极限
2022/04/01 DOTA
SpringBoot前端后端分离之Nginx服务器下载安装过程
2022/08/14 Servers