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模拟登陆阿里妈妈生成商品推广链接
Apr 03 Python
python错误:AttributeError: 'module' object has no attribute 'setdefaultencoding'问题的解决方法
Aug 22 Python
python在windows命令行下输出彩色文字的方法
Mar 19 Python
Python的装饰器用法学习笔记
Jun 24 Python
78行Python代码实现现微信撤回消息功能
Jul 26 Python
python爬虫 批量下载zabbix文档代码实例
Aug 21 Python
Python计算IV值的示例讲解
Feb 28 Python
Python 下载Bing壁纸的示例
Sep 29 Python
Django Auth用户认证组件实现代码
Oct 13 Python
python cookie反爬处理的实现
Nov 01 Python
python爬虫--selenium模块
Mar 31 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
《魔兽争霸3:重制版》更新 多项视觉效果调整
2020/05/04 魔兽争霸
ASP和PHP都是可以删除自身的
2007/04/09 PHP
动态表单验证的操作方法和TP框架里面的ajax表单验证
2017/07/19 PHP
利用PHP实现开心消消乐的算法示例
2017/10/12 PHP
php生成HTML文件的类方法
2019/10/11 PHP
jQuery源码解读之removeClass()方法分析
2015/02/20 Javascript
JS实现仿新浪微博发布内容为空时提示功能代码
2015/08/19 Javascript
jquery 重写 ajax提交并判断权限后 使用load方法报错解决方法
2016/01/19 Javascript
DeviceOne 让你一见钟情的App快速开发平台
2016/02/17 Javascript
14 个折磨人的 JavaScript 面试题
2016/08/08 Javascript
微信小程序实现动态列表项的顺序加载动画
2019/07/25 Javascript
JS使用for in有序获取对象数据
2020/05/19 Javascript
vue实现列表滚动的过渡动画
2020/06/29 Javascript
Python重新引入被覆盖的自带function
2014/07/16 Python
Python设计模式编程中解释器模式的简单程序示例分享
2016/03/02 Python
Python操作csv文件实例详解
2017/07/31 Python
用python结合jieba和wordcloud实现词云效果
2017/09/05 Python
Python中存取文件的4种不同操作
2018/07/02 Python
Python 字符串换行的多种方式
2018/09/06 Python
Python生成验证码、计算具体日期是一年中的第几天实例代码详解
2019/10/16 Python
Python 实现opencv所使用的图片格式与 base64 转换
2020/01/09 Python
python将数据插入数据库的代码分享
2020/08/16 Python
JINS眼镜官方网站:日本最大的眼镜邮购
2016/10/14 全球购物
英国泰坦旅游网站:全球陪同游览,邮轮和铁路旅行
2016/11/29 全球购物
瑞典最大的儿童用品网上商店:pinkorblue.se
2021/03/09 全球购物
新郎新娘婚礼答谢词
2014/01/11 职场文书
政府个人对照检查材料思想汇报
2014/10/08 职场文书
四风问题原因分析及整改措施
2014/10/24 职场文书
神农溪导游词
2015/02/11 职场文书
2015年度员工自我评价范文
2015/03/11 职场文书
经营目标责任书
2015/05/08 职场文书
生日寿星公答谢词
2015/09/29 职场文书
高一语文教学反思
2016/02/16 职场文书
《假如》教学反思
2016/02/17 职场文书
《天使的翅膀》读后感3篇
2019/12/20 职场文书
python某漫画app逆向
2021/03/31 Python