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使用MD5加密字符串示例
Aug 22 Python
python学习之matplotlib绘制散点图实例
Dec 09 Python
python编写Logistic逻辑回归
Dec 30 Python
Python实现的个人所得税计算器示例
Jun 01 Python
pygame实现俄罗斯方块游戏(基础篇2)
Oct 29 Python
python路径的写法及目录的获取方式
Dec 26 Python
Python运行DLL文件的方法
Jan 17 Python
pytorch实现MNIST手写体识别
Feb 14 Python
Python ADF 单位根检验 如何查看结果的实现
Jun 03 Python
Docker如何部署Python项目的实现详解
Oct 26 Python
python 破解加密zip文件的密码
Apr 22 Python
python入门学习关于for else的特殊特性讲解
Nov 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
用PHP动态生成虚拟现实VRML网页
2006/10/09 PHP
PHP set_error_handler()函数使用详解(示例)
2013/11/12 PHP
PHP连接MySQL的2种方法小结以及防止乱码
2014/03/11 PHP
Laravel 解决419错误 -ajax请求错误的问题(CSRF验证)
2019/10/25 PHP
JavaScript高级程序设计(第3版)学习笔记10 再访js对象
2012/10/11 Javascript
表头固定(利用jquery实现原理介绍)
2012/11/08 Javascript
JavaScript常用脚本汇总(三)
2015/03/04 Javascript
javascript实现起伏的水波背景效果
2016/05/16 Javascript
JS实现简易刻度时钟示例代码
2017/03/11 Javascript
layui表格分页 记录勾选的实例
2019/09/02 Javascript
详解微信小程序轨迹回放实现及遇到的坑
2021/02/02 Javascript
Python2.5/2.6实用教程 入门基础篇
2009/11/29 Python
Python队列的定义与使用方法示例
2017/06/24 Python
Python实现的快速排序算法详解
2017/08/01 Python
高质量Python代码编写的5个优化技巧
2017/11/16 Python
用十张图详解TensorFlow数据读取机制(附代码)
2018/02/06 Python
python3安装speech语音模块的方法
2018/12/24 Python
python实现手机销售管理系统
2019/03/19 Python
解决Python找不到ssl模块问题 No module named _ssl的方法
2019/04/29 Python
python 单线程和异步协程工作方式解析
2019/09/28 Python
python字典setdefault方法和get方法使用实例
2019/12/25 Python
pytorch中的自定义反向传播,求导实例
2020/01/06 Python
Keras中的两种模型:Sequential和Model用法
2020/06/27 Python
俄罗斯最大的香水和化妆品网上商店:Randewoo
2020/11/05 全球购物
儿科护士自我鉴定
2013/10/14 职场文书
优良学风班总结材料
2014/02/08 职场文书
中青班党性分析材料
2014/02/16 职场文书
诚实守信道德模范事迹材料
2014/08/15 职场文书
庆六一文艺汇演活动方案
2014/08/26 职场文书
初中体育教学随笔
2015/08/15 职场文书
2019最新劳动仲裁申请书!
2019/07/08 职场文书
MySQL之高可用集群部署及故障切换实现
2021/04/22 MySQL
Redis5之后版本的高可用集群搭建的实现
2021/04/27 Redis
MyBatis-Plus 批量插入数据的操作方法
2021/09/25 Java/Android
Java 常见的限流算法详细分析并实现
2022/04/07 Java/Android
Python 统计序列中元素的出现频度
2022/04/26 Python