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函数缺省值与引用学习笔记分享
Feb 10 Python
python实现k均值算法示例(k均值聚类算法)
Mar 16 Python
python获取指定路径下所有指定后缀文件的方法
May 26 Python
Python 自动化表单提交实例代码
Jun 08 Python
python 日期操作类代码
May 05 Python
浅述python2与python3的简单区别
Sep 19 Python
python 进程间数据共享multiProcess.Manger实现解析
Sep 23 Python
wxpython实现按钮切换界面的方法
Nov 19 Python
详解从Django Allauth中进行登录改造小结
Dec 18 Python
浅谈PyTorch的可重复性问题(如何使实验结果可复现)
Feb 20 Python
Keras 利用sklearn的ROC-AUC建立评价函数详解
Jun 15 Python
Python面向对象多态实现原理及代码实例
Sep 16 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
用PHP和MySQL保存和输出图片
2006/10/09 PHP
解析Extjs与php数据交互(增删查改)
2013/06/25 PHP
php 伪静态之IIS篇
2014/06/02 PHP
destoon安装出现Internal Server Error的解决方法
2014/06/21 PHP
smarty模板引擎中变量及变量修饰器用法实例
2015/01/22 PHP
PHP实现HTTP断点续传的方法
2015/06/17 PHP
php mysql实现mysql_select_db选择数据库
2016/12/30 PHP
php中的单引号、双引号和转义字符详解
2017/02/16 PHP
搜索附近的人PHP实现代码
2018/02/11 PHP
document对象execCommand的command参数介绍
2006/08/01 Javascript
清华大学出版的事半功倍系列 javascript全部源代码
2007/05/04 Javascript
基于jQuery的星级评分插件
2011/08/12 Javascript
jquery 清空file域示例(兼容个浏览器)
2013/10/11 Javascript
JS动态修改表格cellPadding和cellSpacing的方法
2015/03/31 Javascript
JQuery中DOM事件冒泡实例分析
2015/06/13 Javascript
解决JS请求服务器gbk文件乱码的问题
2015/10/16 Javascript
Javascript之Math对象详解
2016/06/07 Javascript
Bootstrap优化站点资源、响应式图片、传送带使用详解3
2016/10/14 Javascript
浅谈Node异步编程的机制
2017/10/18 Javascript
ajax前台后台跨域请求处理方式
2018/02/08 Javascript
p5.js入门教程之图片加载
2018/03/20 Javascript
解决IE11 vue +webpack 项目中数据更新后页面没有刷新的问题
2018/09/25 Javascript
vue调试工具vue-devtools安装及使用方法
2018/11/07 Javascript
解决vue 界面在苹果手机上滑动点击事件等卡顿问题
2018/11/27 Javascript
详解JavaScript的内存空间、赋值和深浅拷贝
2019/04/17 Javascript
解决node.js含有%百分号时发送get请求时浏览器地址自动编码的问题
2019/11/20 Javascript
vue项目,代码提交至码云,iconfont的用法说明
2020/07/30 Javascript
Css3+Js制作漂亮时钟(附源码)
2013/04/24 HTML / CSS
实例教程 一款纯css3实现的数字统计游戏
2014/11/10 HTML / CSS
Gap工厂店:Gap Factory
2017/11/02 全球购物
GAP阿联酋官网:GAP UAE
2017/11/30 全球购物
Chi Chi London官网:购买连衣裙和礼服
2020/10/25 全球购物
抗洪救灾先进集体事迹材料
2014/05/26 职场文书
说好普通话圆梦你我他演讲稿
2014/09/21 职场文书
证券公司客户经理岗位职责
2015/04/09 职场文书
Python标准库之typing的用法(类型标注)
2021/06/02 Python