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实现猜数字游戏(无重复数字)示例分享
Mar 29 Python
Python微信公众号开发平台
Jan 25 Python
Python 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)
Mar 19 Python
举例讲解Python常用模块
Mar 08 Python
python实现自动化上线脚本的示例
Jul 01 Python
python函数不定长参数使用方法解析
Dec 14 Python
django 利用Q对象与F对象进行查询的实现
May 15 Python
完美解决Django2.0中models下的ForeignKey()问题
May 19 Python
浅谈python 调用open()打开文件时路径出错的原因
Jun 05 Python
Python趣味入门教程之循环语句while
Aug 26 Python
详解Python 函数参数的拆解
Sep 02 Python
浅谈pytorch中的dropout的概率p
May 27 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执行linux系统命令的常用函数使用说明
2010/04/27 PHP
用PHP+MySQL搭建聊天室功能实例代码
2012/08/20 PHP
合并ThinkPHP配置文件以消除代码冗余的实现方法
2014/07/22 PHP
thinkphp备份数据库的方法分享
2015/01/04 PHP
PHP使用array_fill定义多维数组的方法
2015/03/18 PHP
Mootools 1.2教程 函数
2009/09/15 Javascript
javascript打印输出json实例
2013/11/11 Javascript
js打开windows上的可执行文件示例
2014/05/27 Javascript
jquery中添加属性和删除属性
2015/06/03 Javascript
js如何实现点击标签文字,文字在文本框出现
2015/08/05 Javascript
bootstrap-wysiwyg结合ajax实现图片上传实时刷新功能
2016/05/27 Javascript
第一次接触神奇的Bootstrap菜单和导航
2016/08/01 Javascript
js利用for in循环获取 一个对象的所有属性以及值的实例
2017/03/30 Javascript
JQuery 选择器、DOM节点操作练习实例
2017/09/28 jQuery
Angular Renderer (渲染器)的具体使用
2018/05/03 Javascript
JQuery的加载和选择器用法简单示例
2019/05/13 jQuery
Vue实现 点击显示再点击隐藏效果(点击页面空白区域也隐藏效果)
2020/01/16 Javascript
为Python的web框架编写前端模版的教程
2015/04/30 Python
python检查字符串是否是正确ISBN的方法
2015/07/11 Python
Python 中 list 的各项操作技巧
2017/04/13 Python
Python绑定方法与非绑定方法详解
2017/08/18 Python
Python中执行存储过程及获取存储过程返回值的方法
2017/10/07 Python
Jacobi迭代算法的Python实现详解
2019/06/29 Python
Python下opencv图像阈值处理的使用笔记
2019/08/04 Python
Python实现基于socket的udp传输与接收功能详解
2019/11/15 Python
python如何输出反斜杠
2020/06/18 Python
德国体育用品网上商店:SC24.com
2016/08/01 全球购物
澳大利亚优质的家居用品和生活方式公司:Bed Bath N’ Table
2019/04/16 全球购物
娱乐地球:Entertainment Earth
2020/01/08 全球购物
介绍一下HDLC(High-Level Data Link Control)高层数据链路协议
2012/01/21 面试题
助人为乐表扬信范文
2014/01/14 职场文书
酒店个人求职信范文
2014/01/25 职场文书
三严三实对照检查材料
2014/09/22 职场文书
贷款收入证明格式
2015/06/24 职场文书
践行三严三实心得体会(2016推荐篇)
2016/01/06 职场文书
Python多个MP4合成视频的实现方法
2021/07/16 Python