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 时间操作例子和时间格式化参数小结
Apr 24 Python
Python字符串和文件操作常用函数分析
Apr 08 Python
Python线程的两种编程方式
Apr 14 Python
Python3使用requests包抓取并保存网页源码的方法
Mar 15 Python
详解Python装饰器由浅入深
Dec 09 Python
Python使用回溯法子集树模板获取最长公共子序列(LCS)的方法
Sep 08 Python
python中实现数组和列表读取一列的方法
Apr 03 Python
Python从函数参数类型引出元组实例分析
May 28 Python
python numpy 常用随机数的产生方法的实现
Aug 21 Python
Python如何脚本过滤文件中的注释
May 27 Python
Python爬虫新手入门之初学lxml库
Dec 20 Python
python中 Flask Web 表单的使用方法
May 20 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的L方法使用简介
2014/06/18 PHP
PHP中调用C/C++制作的动态链接库的教程
2016/03/10 PHP
Laravel下生成验证码的类
2017/11/15 PHP
php工具型代码之印章抠图
2018/07/18 PHP
PHP日志LOG类定义与用法示例
2018/09/06 PHP
PHP hebrev()函数用法讲解
2019/02/21 PHP
ymPrompt的doHandler方法来实现获取子窗口返回值的方法
2010/06/25 Javascript
图标线性回归斜着移动到指定的位置
2013/08/16 Javascript
javasciprt下jquery函数$.post执行无响应的解决方法
2014/03/13 Javascript
javascript实现获取字符串hash值
2015/05/10 Javascript
js实现滚动条滚动到某个位置便自动定位某个tr
2021/01/20 Javascript
JQuery.validate在ie8下不支持的快速解决方法
2016/05/18 Javascript
jQuery插件实现文件上传功能(支持拖拽)
2020/08/27 Javascript
JavaScript中对象的不同创建方法
2016/08/12 Javascript
在微信小程序中渲染HTML内容的方法示例
2018/09/28 Javascript
基于Vue SEO的四种方案(小结)
2019/07/01 Javascript
JS中自定义事件的使用与触发操作实例分析
2019/11/01 Javascript
node.js中 mysql 增删改查操作及async,await处理实例分析
2020/02/11 Javascript
sqlalchemy对象转dict的示例
2014/04/22 Python
Python正规则表达式学习指南
2016/08/02 Python
神经网络python源码分享
2017/12/15 Python
深入分析python数据挖掘 Json结构分析
2018/04/21 Python
python 获取字符串MD5值方法
2018/05/29 Python
tensorflow使用神经网络实现mnist分类
2018/09/08 Python
virtualenv 指定 python 解释器的版本方法
2018/10/25 Python
详解Django定时任务模块设计与实践
2019/07/24 Python
基于Python下载网络图片方法汇总代码实例
2020/06/24 Python
Python读取图像并显示灰度图的实现
2020/12/01 Python
pycharm配置安装autopep8自动规范代码的实现
2021/03/02 Python
UNOde50美国官网:西班牙珠宝品牌
2020/08/15 全球购物
学校岗位设置方案
2014/01/16 职场文书
护理专业毕业生自我鉴定总结
2014/03/24 职场文书
小学一年级评语大全
2014/04/22 职场文书
公路绿化方案
2014/05/12 职场文书
禁止高声喧哗的标语
2014/06/11 职场文书
会计专业求职信范文
2015/03/19 职场文书