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文件和目录操作详解
Feb 08 Python
python 中的divmod数字处理函数浅析
Oct 17 Python
python3+PyQt5实现自定义分数滑块部件
Apr 24 Python
python学生管理系统
Jan 30 Python
Python实现字典按key或者value进行排序操作示例【sorted】
May 03 Python
Python自动化运维之Ansible定义主机与组规则操作详解
Jun 13 Python
Django使用uwsgi部署时的配置以及django日志文件的处理方法
Aug 30 Python
如何使用python代码操作git代码
Feb 29 Python
Python正则表达式学习小例子
Mar 03 Python
pyspark 随机森林的实现
Apr 24 Python
python利用os模块编写文件复制功能——copy()函数用法
Jul 13 Python
Python OpenCV实现图像模板匹配详解
Apr 07 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 CKEditor 上传图片实现代码
2009/11/06 PHP
windows环境下使用Composer安装ThinkPHP5
2018/05/18 PHP
动态修改DOM 里面的 id 属性的弊端分析
2008/09/03 Javascript
动态添加js事件实现代码
2009/03/12 Javascript
Jquery 数据选择插件Pickerbox使用介绍
2012/08/24 Javascript
jquery实现简单手风琴菜单效果实例
2015/06/13 Javascript
JavaScript调用浏览器打印功能实例分析
2015/07/17 Javascript
javascript模块化简单解析
2016/04/07 Javascript
JS 根据子网掩码,网关计算出所有IP地址范围示例
2020/04/23 Javascript
codeMirror插件使用讲解
2017/01/16 Javascript
Nodejs进阶之服务端字符编解码和乱码处理
2017/09/04 NodeJs
React Router v4 入坑指南(小结)
2018/04/08 Javascript
Nodejs 发布自己的npm包并制作成命令行工具的实例讲解
2018/05/15 NodeJs
Vue实现textarea固定输入行数与添加下划线样式的思路详解
2018/06/28 Javascript
详解React 服务端渲染方案完美的解决方案
2018/12/14 Javascript
JS实现计算小于非负数n的素数的数量算法示例
2019/02/26 Javascript
Vue实现一个图片懒加载插件
2019/03/11 Javascript
详解Vue+Element的动态表单,动态表格(后端发送配置,前端动态生成)
2019/04/20 Javascript
vue 自动化路由实现代码
2019/09/03 Javascript
十分钟教你上手ES2020新特性
2020/02/12 Javascript
解决vue 退出动画无效的问题
2020/08/09 Javascript
vue 扩展现有组件的操作
2020/08/14 Javascript
mustache.js实现首页元件动态渲染的示例代码
2020/12/28 Javascript
Python的collections模块中的OrderedDict有序字典
2016/07/07 Python
Python多维/嵌套字典数据无限遍历的实现
2016/11/04 Python
Python进度条实时显示处理进度的示例代码
2018/01/30 Python
Python爬虫包BeautifulSoup实例(三)
2018/06/17 Python
树莓派动作捕捉抓拍存储图像脚本
2019/06/22 Python
python实现各种插值法(数值分析)
2019/07/30 Python
医院实习接收函
2014/01/12 职场文书
意向书范文
2014/03/31 职场文书
《埃及的金字塔》教学反思
2014/04/07 职场文书
2014医学院领导班子对照检查材料思想汇报
2014/09/19 职场文书
教你怎么用Python实现多路径迷宫
2021/04/29 Python
Java面试题冲刺第十六天--消息队列
2021/08/07 面试题
MySQL自定义函数及触发器
2022/08/05 MySQL