原始出处:http://gaopenghigh.iteye.com/blog/1483864

python列表排序

简单记一下python中List的sort方法(或者sorted内建函数)的用法。

关键字: 
python列表排序 python字典排序 sorted

List的元素可以是各种东西,字符串,字典,自己定义的类等。

sorted函数用法如下:

  1. 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排序

  1. >>> students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10),]

用key函数排序(lambda的用法见 注释1)

  1. >>> sorted(students, key=lambda student : student[2])   # sort by age
  2. [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

用cmp函数排序

  1. >>> sorted(students, cmp=lambda x,y : cmp(x[2], y[2])) # sort by age
  2. [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

用 operator 函数来加快速度, 上面排序等价于:(itemgetter的用法见 注释2)

  1. >>> from operator import itemgetter, attrgetter
  2. >>> sorted(students, key=itemgetter(2))

用 operator 函数进行多级排序

  1. >>> sorted(students, key=itemgetter(1,2))  # sort by grade then by age
  2. [('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]

2. 对由字典排序

  1. >>> d = {'data1':3, 'data2':1, 'data3':2, 'data4':4}
  2. >>> sorted(d.iteritems(), key=itemgetter(1), reverse=True)
  3. [('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])

相当于

  1. def itemgetter(i,*a):
  2. def func(obj):
  3. r = obj[i]
  4. if a:
  5. r = (r,) + tuple(obj[i] for i in a)
  6. return r
  7. return func
  8. >>> a = [1,2,3]
  9. >>> b=operator.itemgetter(1)
  10. >>> b(a)
  11. 2
  12. >>> b=operator.itemgetter(1,0)
  13. >>> b(a)
  14. (2, 1)
  15. >>> b=itemgetter(1)
  16. >>> b(a)
  17. 2
  18. >>> b=itemgetter(1,0)
  19. >>> b(a)
  20. (2, 1)

参考资料: 
1. http://www.linuxso.com/linuxbiancheng/13340.html 
2. http://www.douban.com/note/13460891/

【转】python中List的sort方法(或者sorted内建函数)的用法的更多相关文章

  1. python中List的sort方法的用法

    python列表排序 简单记一下python中List的sort方法(或者sorted内建函数)的用法. 关键字: python列表排序 python字典排序 sorted List的元素可以是各种东 ...

  2. python中list的sort方法

    转:https://www.cnblogs.com/zle1992/p/6271105.html 使用python对列表(list)进行排序,说简单也简单,说复杂也复杂,我一开始学的时候也搞不懂在说什 ...

  3. 【转】关于python中re模块split方法的使用

    注:最近在研究文本处理,需要用到正则切割文本,所以收索到了这篇文章,很有用,谢谢原作者. 原址:http://blog.sciencenet.cn/blog-314114-775285.html 关于 ...

  4. 查看python中模块的所有方法

    查看python中模块的所有方法     安装的python模块,现将查看方法总结如下 一.CMD命令行下使用pydoc命令 在命令行下运行$ pydoc modules即可查看 二.在python交 ...

  5. PySpark 的背后原理--在Driver端,通过Py4j实现在Python中调用Java的方法.pyspark.executor 端一个Executor上同时运行多少个Task,就会有多少个对应的pyspark.worker进程。

    PySpark 的背后原理 Spark主要是由Scala语言开发,为了方便和其他系统集成而不引入scala相关依赖,部分实现使用Java语言开发,例如External Shuffle Service等 ...

  6. python中requests库使用方法详解

    目录 python中requests库使用方法详解 官方文档 什么是Requests 安装Requests库 基本的GET请求 带参数的GET请求 解析json 添加headers 基本POST请求 ...

  7. 全面了解python中的类,对象,方法,属性

    全面了解python中的类,对象,方法,属性 python中一切皆为对象,所谓对象:我自己就是一个对象,我玩的电脑就是对象,坐着的椅子就是对象,家里养的小狗也是一个对象...... 我们通过描述属性( ...

  8. python中列表元素连接方法join用法实例

    python中列表元素连接方法join用法实例 这篇文章主要介绍了python中列表元素连接方法join用法,实例分析了Python中join方法的使用技巧,非常具有实用价值,分享给大家供大家参考. ...

  9. python 中去除空格的方法

    python 中去除空格的方法: def trim(s): l=[] for i in s: if i!=' ': l.append(i) return ''.join(l) 其中可以使用下面的 '' ...

随机推荐

  1. Uber即将进驻扬州啦,车主火热招募中!

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  2. oracle hints

    oracle hints 今天是2013-10-08,对于oracle hint有很多,具体可以参考联机手册: http://docs.oracle.com/cd/E11882_01/server.1 ...

  3. poj 2462 Period of an Infinite Binary Expansion

    欧拉定理.根据分数转换成2进制的过程,分子每次都乘2.对于循环节x,当2^x = 1(mod b)时肯定是循环节.显然当分母不能整除2的时候,即分母和2互质的话,就可以利用欧拉定理,使得2^(Eule ...

  4. Ruby学习笔记(二)

    1.block 代码块 do...end 或 {} 构成一个代码块,就像常见的 .each后面跟的代码块. my_nums = [1,2,3] my_double_nums = my_nums.col ...

  5. The Six Types of Rails Association

    翻译整理自:http://guides.rubyonrails.org/v3.2.13/association_basics.html 想吐槽一句,http://guides.ruby-china.o ...

  6. poj 2240 Arbitrage (Floyd)

    链接:poj 2240 题意:首先给出N中货币,然后给出了这N种货币之间的兑换的兑换率. 如 USDollar 0.5 BritishPound 表示 :1 USDollar兑换成0.5 Britis ...

  7. hadoop自带的writable类型

    Hadoop 中,并没有使用Java自带的基本类型类(Integer.Float等),而是使用自己开发的类.Hadoop 自带有很多序列化类型,大致分为以下两种: 实现了WritableCompara ...

  8. [转]Flex 布局教程:语法篇

    网页布局(layout)是CSS的一个重点应用. 布局的传统解决方案,基于盒状模型,依赖 display属性 + position属性 + float属性.它对于那些特殊布局非常不方便,比如,垂直居中 ...

  9. app 的内存优化

    这篇文章是笔者在开发App过程中发现的一些内存问题, 然后学习了YYKit框架时候也发现了图片的缓存处理 (YYKit 作者联系了我, 说明了YYKit重写imageNamed:的目的不是为了内存管理 ...

  10. java之log4j的配置

    java之log4j的配置 log4j有很多的优点,用起来很方便,就是配置起来有些麻烦,下面我介绍一下log4j的配置方法. log4j是用来记录日志的. 软件的运行过程离不开日志.日志主要用来记录系 ...