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之模拟鼠标键盘动作具体实现
Dec 30 Python
Python调用C/C++动态链接库的方法详解
Jul 22 Python
剖析Python的Tornado框架中session支持的实现代码
Aug 21 Python
pytorch + visdom 处理简单分类问题的示例
Jun 04 Python
详解pyenv下使用python matplotlib模块的问题解决
Nov 29 Python
python3中使用__slots__限定实例属性操作分析
Feb 14 Python
Python如何存储数据到json文件
Mar 09 Python
Python 基于jwt实现认证机制流程解析
Jun 22 Python
Python logging日志模块 配置文件方式
Jul 12 Python
在Django中使用MQTT的方法
May 10 Python
Python入门之使用pandas分析excel数据
May 12 Python
Python入门学习之类的相关知识总结
May 25 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遍历二维数组的代码
2011/04/22 PHP
PHP反向代理类代码
2014/08/15 PHP
php中字符查找函数strpos、strrchr与strpbrk用法
2014/11/18 PHP
ThinkPHP Where 条件中常用表达式示例(详解)
2017/03/31 PHP
javascript插入样式实现代码
2012/02/22 Javascript
js 控制图片大小核心讲解
2013/10/09 Javascript
javascript禁用Tab键脚本实例
2013/11/22 Javascript
鼠标选择动态改变网页背景颜色的JS代码
2013/12/10 Javascript
javascript框架设计读书笔记之数组的扩展与修复
2014/12/02 Javascript
JavaScript html5 canvas绘制时钟效果(二)
2016/03/27 Javascript
Node.js读取文件内容示例
2017/03/07 Javascript
Vue中对比scoped css和css module的区别
2018/05/17 Javascript
详解JavaScript中typeof与instanceof用法
2018/10/24 Javascript
Js 利用正则表达式和replace函数获取string中所有被匹配到的文本(推荐)
2018/10/28 Javascript
使vue实现jQuery调用的两种方法
2019/05/12 jQuery
vue.js中导出Excel表格的案例分析
2019/06/11 Javascript
Python中的map、reduce和filter浅析
2014/04/26 Python
Python的__builtin__模块中的一些要点知识
2015/05/02 Python
python+Django+apache的配置方法详解
2016/06/01 Python
对比Python中__getattr__和 __getattribute__获取属性的用法
2016/06/21 Python
python字符串中的单双引
2017/02/16 Python
JSONLINT:python的json数据验证库实例解析
2017/11/28 Python
python写一个md5解密器示例
2018/02/23 Python
python XlsxWriter模块创建aexcel表格的实例讲解
2018/05/03 Python
Django web框架使用url path name详解
2019/04/29 Python
Python学习笔记之lambda表达式用法详解
2019/08/08 Python
pytorch 在网络中添加可训练参数,修改预训练权重文件的方法
2019/08/17 Python
python图片验证码识别最新模块muggle_ocr的示例代码
2020/07/03 Python
CSS3 完美实现圆角效果
2009/07/13 HTML / CSS
魔幻般冒泡背景的CSS3按钮动画
2016/02/27 HTML / CSS
世界上最值得信赖的多日游在线市场:TourRadar
2018/07/20 全球购物
EJB3.1都有哪些改进
2012/11/17 面试题
ajax是什么及其工作原理
2012/02/08 面试题
好矿嫂事迹材料
2014/01/21 职场文书
我的小天地教学反思
2014/04/30 职场文书
《一面五星红旗》教学反思
2016/02/23 职场文书