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读写Redis数据库操作示例
Mar 18 Python
python将字典内容存入mysql实例代码
Jan 18 Python
Python 使用PIL numpy 实现拼接图片的示例
May 08 Python
通过Python模块filecmp 对文件比较的实现方法
Jun 29 Python
Python批处理删除和重命名文件夹的实例
Jul 11 Python
Python中的Numpy矩阵操作
Aug 12 Python
python 对key为时间的dict排序方法
Oct 17 Python
python dict 相同key 合并value的实例
Jan 21 Python
python实现QQ邮箱/163邮箱的邮件发送
Jan 22 Python
详解Python的数据库操作(pymysql)
Apr 04 Python
TensorFlow保存TensorBoard图像操作
Jun 23 Python
Python Flask实现进度条
May 11 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写的AES加密解密类分享
2014/06/20 PHP
php+mysql查询优化简单实例
2015/01/13 PHP
PHP微信红包API接口
2015/12/05 PHP
PHP 5.6.11 访问SQL Server2008R2的几种情况详解
2016/08/08 PHP
PHP十六进制颜色随机生成器功能示例
2017/07/24 PHP
javascript jQuery插件练习
2008/12/24 Javascript
input+select(multiple) 实现下拉框输入值
2009/05/21 Javascript
SyntaxHighlighter语法高亮插件使用说明
2011/08/14 Javascript
jQuery中使用了document和window哪些属性和方法小结
2011/09/13 Javascript
jQuery实现当按下回车键时绑定点击事件
2014/01/28 Javascript
jquery 取子节点及当前节点属性值的方法
2014/08/24 Javascript
轻松实现javascript数据双向绑定
2015/11/11 Javascript
js插件实现图片滑动验证码
2020/09/29 Javascript
vue-router2.0 组件之间传参及获取动态参数的方法
2017/11/10 Javascript
浅析vue.js数组的变异方法
2018/06/30 Javascript
Node.js中package.json中库的版本号(~和^)
2019/04/02 Javascript
node中IO以及定时器优先级详解
2019/05/10 Javascript
用实例详解Python中的Django框架中prefetch_related()函数对数据库查询的优化
2015/04/01 Python
自学python的建议和周期预算
2019/01/30 Python
Django如何开发简单的查询接口详解
2019/05/17 Python
华为2019校招笔试题之处理字符串(python版)
2019/06/25 Python
django foreignkey外键使用的例子 相当于left join
2019/08/06 Python
将python依赖包打包成window下可执行文件bat方式
2019/12/26 Python
python中entry用法讲解
2020/12/04 Python
美国专注于健康商品的网站:eVitamins
2017/01/23 全球购物
美国波道夫·古德曼百货官网:Bergdorf Goodman
2017/11/07 全球购物
匡威英国官网:Converse英国
2018/12/02 全球购物
如何写你的创业计划书
2014/01/07 职场文书
新闻学专业大学生职业生涯规划范文
2014/03/02 职场文书
励志演讲稿300字
2014/08/21 职场文书
银行反四风对照检查材料
2014/09/29 职场文书
小学教师个人总结
2015/02/05 职场文书
大学毕业生自我评价
2015/03/02 职场文书
2015年污水处理厂工作总结
2015/05/26 职场文书
2016优秀班主任个人先进事迹材料
2016/02/26 职场文书
使用 JavaScript 制作页面效果
2021/04/21 Javascript