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 24 Python
Python中map和列表推导效率比较实例分析
Jun 17 Python
Python文件的读写和异常代码示例
Oct 31 Python
ubuntu中配置pyqt4环境教程
Dec 27 Python
python十进制和二进制的转换方法(含浮点数)
Jul 07 Python
对python添加模块路径的三种方法总结
Oct 16 Python
Python数据类型之Dict字典实例详解
May 07 Python
Python异常处理例题整理
Jul 07 Python
python实现的自动发送消息功能详解
Aug 15 Python
在Django中实现添加user到group并查看
Nov 18 Python
django 读取图片到页面实例
Mar 27 Python
python在一个范围内取随机数的简单实例
Aug 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批量缩放图片的代码[ini参数控制]
2011/02/11 PHP
PHP的一个基础知识 表单提交
2011/07/04 PHP
php中将汉字转换成拼音的函数代码
2012/09/08 PHP
限制ckeditor上传图片文件大小的方法
2013/11/15 PHP
关于php支持的协议与封装协议总结(推荐)
2017/11/17 PHP
javascript showModalDialog 内跳转页面的问题
2010/11/25 Javascript
禁止ajax缓存获取程序最新数据的方法
2013/11/19 Javascript
Jquery 改变radio/checkbox选中状态,获取选中的值(示例代码)
2013/12/12 Javascript
Node.js文件操作详解
2014/08/16 Javascript
javascript实现密码强度显示
2015/03/18 Javascript
jQuery获得字体颜色16位码的方法
2016/02/20 Javascript
JavaScript的设计模式经典之代理模式
2016/02/24 Javascript
基于JS实现数字+字母+中文的混合排序方法
2016/06/06 Javascript
Vue.js 插件开发详解
2017/03/29 Javascript
微信小程序获取用户openId的实现方法
2017/05/23 Javascript
javascript 开发之网页兼容各种浏览器
2017/09/28 Javascript
vue动态改变背景图片demo分享
2018/09/13 Javascript
vue 中 elment-ui table合并上下两行相同数据单元格
2019/12/26 Javascript
小程序自定义模板实现吸顶功能
2020/01/08 Javascript
python实现简易动态时钟
2018/11/19 Python
Python设计模式之抽象工厂模式原理与用法详解
2019/01/15 Python
Python利用神经网络解决非线性回归问题实例详解
2019/07/19 Python
python自动化测试之DDT数据驱动的实现代码
2019/07/23 Python
如何使用python记录室友的抖音在线时间
2020/06/29 Python
python编写实现抽奖器
2020/09/10 Python
Visual-Click葡萄牙:欧洲领先的在线眼镜商
2020/02/17 全球购物
执行力心得体会
2013/12/31 职场文书
运动会标语
2014/06/21 职场文书
毕业证代领委托书
2014/09/26 职场文书
群众路线四风对照检查材料
2014/11/04 职场文书
组织生活会发言材料
2014/12/15 职场文书
最感人的道歉情书
2015/05/12 职场文书
2016新年年会主持词
2015/07/06 职场文书
同事欢送会致辞
2015/07/31 职场文书
酒店员工管理制度
2015/08/05 职场文书
学习十八大的感悟
2015/08/11 职场文书