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中无限元素列表的实现方法
Aug 18 Python
Python实现二维数组按照某行或列排序的方法【numpy lexsort】
Sep 22 Python
Python打包方法Pyinstaller的使用
Oct 09 Python
小白入门篇使用Python搭建点击率预估模型
Oct 12 Python
pycharm在调试python时执行其他语句的方法
Nov 29 Python
python数据处理 根据颜色对图片进行分类的方法
Dec 08 Python
解决pyttsx3无法封装的问题
Dec 24 Python
Python3匿名函数lambda介绍与使用示例
May 18 Python
解决Python3 抓取微信账单信息问题
Jul 19 Python
Django继承自带user表并重写的例子
Nov 18 Python
Django如何使用jwt获取用户信息
Apr 21 Python
python四种出行路线规划的实现
Jun 23 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
php下将多个数组合并成一个数组的方法与实例代码
2011/02/03 PHP
php whois查询API制作方法
2011/06/23 PHP
php使用unset()删除数组中某个单元(键)的方法
2015/02/17 PHP
php从字符串创建函数的方法
2015/03/16 PHP
键盘控制事件应用教程大全
2006/11/24 Javascript
JavaScript 给汉字排序实例代码
2008/06/28 Javascript
javascript Split方法,indexOf方法、lastIndexOf 方法和substring 方法
2009/03/21 Javascript
jquery 操作单选框,复选框,下拉列表实现代码
2009/10/27 Javascript
js 编写规范
2010/03/03 Javascript
prettify 代码高亮着色器google出品
2010/12/28 Javascript
extjs3 combobox取value和text案例详解
2013/02/06 Javascript
javascript 循环调用示例介绍
2013/11/20 Javascript
node.js中的querystring.stringify方法使用说明
2014/12/10 Javascript
js智能获取浏览器版本UA信息的方法
2016/08/08 Javascript
jQuery实现为LI列表前3行设置样式的方法【2种方法】
2016/09/04 Javascript
JS判断微信扫码的方法
2017/08/07 Javascript
理解nodejs的stream和pipe机制的原理和实现
2017/08/12 NodeJs
vue的基本用法与常见指令
2017/08/15 Javascript
使用vue2实现带地区编号和名称的省市县三级联动效果
2018/11/05 Javascript
JS删除String里某个字符的方法
2021/01/06 Javascript
layui自定义工具栏的方法
2019/09/19 Javascript
webpack4 optimization使用总结
2019/11/10 Javascript
[01:22:19]EG vs TNC Supermajor小组赛B组败者组第一轮 BO3 第二场 6.2
2018/06/03 DOTA
简单的通用表达式求10乘阶示例
2014/03/03 Python
打包发布Python模块的方法详解
2016/09/18 Python
浅谈Pycharm的项目文件名是红色的原因及解决方式
2020/06/01 Python
完美解决torch.cuda.is_available()一直返回False的玄学方法
2021/02/06 Python
材料化学应届生求职信
2013/10/09 职场文书
毕业生大学生活自我总结
2014/01/31 职场文书
致接力运动员广播稿
2014/02/17 职场文书
有趣的广告词
2014/03/18 职场文书
公安纪律作风整顿剖析材料
2014/10/10 职场文书
导游词之徐州云龙湖
2019/11/19 职场文书
在项目中使用redis做缓存的一些思路
2021/09/14 Redis
MySQL空间数据存储及函数
2021/09/25 MySQL