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中使用mechanize模块模拟浏览器功能
May 05 Python
python 专题九 Mysql数据库编程基础知识
Mar 16 Python
Python使用PyCrypto实现AES加密功能示例
May 22 Python
PyQt5每天必学之像素图控件QPixmap
Apr 19 Python
Django contenttypes 框架详解(小结)
Aug 13 Python
Scrapy使用的基本流程与实例讲解
Oct 21 Python
如何使用Python实现斐波那契数列
Jul 02 Python
Django Haystack 全文检索与关键词高亮的实现
Feb 17 Python
解决IDEA 的 plugins 搜不到任何的插件问题
May 04 Python
Python学习之os模块及用法
Jun 03 Python
pytorch加载语音类自定义数据集的方法教程
Nov 10 Python
利用Python+OpenCV三步去除水印
May 28 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
基于Linux调试工具strace与gdb的常用命令总结
2013/06/03 PHP
初识laravel5
2015/03/02 PHP
PHP多文件上传实例
2015/07/09 PHP
PHP-FPM和Nginx的通信机制详解
2019/02/01 PHP
如何制作浮动广告 JavaScript制作浮动广告代码
2012/12/30 Javascript
jquery移除button的inline onclick事件(已测试及兼容浏览器)
2013/01/25 Javascript
jQuery.prototype.init选择器构造函数源码思路分析
2013/02/05 Javascript
开发中可能会用到的jQuery小技巧
2014/03/07 Javascript
自己用jQuery写了一个图片的马赛克消失效果
2014/05/04 Javascript
JS实现从顶部下拉显示的带动画QQ客服特效代码
2015/10/24 Javascript
Markdown与Bootstrap相结合实现图片自适应属性
2016/05/04 Javascript
jQuery实现背景弹性滚动的导航效果
2016/06/01 Javascript
vue脚手架vue-cli的学习使用教程
2017/06/06 Javascript
AngularJS实现页面跳转后自动弹出对话框实例代码
2017/08/02 Javascript
vue项目中用cdn优化的方法
2018/01/03 Javascript
JS实现带导航城市列表以及输入搜索功能
2018/01/04 Javascript
[原创]jQuery实现合并/追加数组并去除重复项的方法
2018/04/11 jQuery
Vue.js轮播图走马灯代码实例(全)
2019/05/08 Javascript
js console.log打印对象时属性缺失的解决方法
2019/05/23 Javascript
基于Node的Axure文件在线预览的实现代码
2019/08/28 Javascript
jQuery/JS监听input输入框值变化实例
2019/10/17 jQuery
selenium+java中用js来完成日期的修改
2019/10/31 Javascript
js键盘事件实现人物的行走
2020/01/17 Javascript
谈谈JavaScript令人迷惑的==与+
2020/08/31 Javascript
React Native登录之指纹登录篇的示例代码
2020/11/03 Javascript
[03:42]2018完美盛典-《加冕》
2018/12/16 DOTA
Python中强大的命令行库click入门教程
2016/12/26 Python
Python开启线程,在函数中开线程的实例
2019/02/22 Python
wxPython实现列表增删改查功能
2019/11/19 Python
css3 盒模型以及box-sizing属性全面了解
2016/09/20 HTML / CSS
HTML5 canvas标签实现刮刮卡效果
2015/04/24 HTML / CSS
澳大利亚家具和家居用品在线:BROSA
2017/11/02 全球购物
英国马匹装备和马术用品购物网站:Equine Superstore
2019/03/03 全球购物
Rhone官方网站:男士运动服装、健身服装和高级运动服
2019/05/01 全球购物
Wilson体育用品官网:美国著名运动器材品牌
2019/05/12 全球购物
仓库主管的岗位职责
2013/12/04 职场文书