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程序设计入门(2)变量类型简介
Jun 16 Python
python中pycurl库的用法实例
Sep 30 Python
轻松掌握python设计模式之策略模式
Nov 18 Python
Python 2与Python 3版本和编码的对比
Feb 14 Python
Python3结合Dlib实现人脸识别和剪切
Jan 24 Python
django 单表操作实例详解
Jul 30 Python
Tensorflow 自定义loss的情况下初始化部分变量方式
Jan 06 Python
Python中常用的高阶函数实例详解
Feb 21 Python
python GUI库图形界面开发之PyQt5动态(可拖动控件大小)布局控件QSplitter详细使用方法与实例
Mar 06 Python
Python collections.defaultdict模块用法详解
Jun 18 Python
解决Python 写文件报错TypeError的问题
Oct 23 Python
Python实现树莓派摄像头持续录像并传送到主机的步骤
Nov 30 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 简易输出CSV表格文件的方法详解
2013/06/20 PHP
详谈PHP面向对象中常用的关键字和魔术方法
2017/02/04 PHP
一些mootools的学习资源
2010/02/07 Javascript
jQuery之ajax技术的详细介绍
2013/06/19 Javascript
js数组的基本用法及数组根据下标(数值或字符)移除元素
2013/10/20 Javascript
在JavaScript中判断整型的N种方法示例介绍
2014/06/18 Javascript
javascript中hasOwnProperty() 方法使用指南
2015/03/09 Javascript
jQuery实现简单的日期输入格式化控件
2015/03/12 Javascript
超详细的javascript数组方法汇总
2015/11/21 Javascript
轻松使用jQuery双向select控件Bootstrap Dual Listbox
2015/12/13 Javascript
jquery实现左右无缝轮播图
2020/07/31 Javascript
javascript简写常用的12个技巧(可以大大减少你的js代码量)
2020/03/28 Javascript
Vue-cli-webpack搭建斗鱼直播步骤详解
2017/11/17 Javascript
一份超级详细的Vue-cli3.0使用教程【推荐】
2018/11/15 Javascript
jQuery实现的简单歌词滚动功能示例
2019/01/07 jQuery
详解vue2.0模拟后台json数据
2019/05/16 Javascript
node.js制作一个简单的登录拦截器
2020/02/10 Javascript
微信小程序个人中心的列表控件实现代码
2020/04/26 Javascript
详解JavaScript 事件流
2020/09/02 Javascript
vue实现简易的双向数据绑定
2020/12/29 Vue.js
vue 计算属性和侦听器的使用小结
2021/01/25 Vue.js
python中while循环语句用法简单实例
2015/05/07 Python
python实现中文分词FMM算法实例
2015/07/10 Python
Python机器学习算法库scikit-learn学习之决策树实现方法详解
2019/07/04 Python
python中68个内置函数的总结与介绍
2020/02/24 Python
ubuntu 安装pyqt5和卸载pyQt5的方法
2020/03/24 Python
CSS3 animation实现简易幻灯片轮播特效
2016/09/27 HTML / CSS
HTML5自定义mp3播放器源码
2020/01/06 HTML / CSS
Blank NYC官网:夹克、牛仔裤等
2020/12/16 全球购物
输入N,打印N*N矩阵
2012/02/20 面试题
语文教学随笔感言
2014/02/18 职场文书
活动总结的格式
2014/05/07 职场文书
2014年服务员个人工作总结
2014/12/23 职场文书
工会工作个人总结
2015/03/03 职场文书
vue报错function () { [native code] },无法出现我们想要的内容 Unknown custom element
2022/04/11 Vue.js
解决springboot druid数据库连接失败后一直重连的方法
2022/04/19 Java/Android