原始出处: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. centos下apache thrift的安装

    参考:http://running.iteye.com/blog/1983463  thrift-0.9.0安装 最好切换到root用户操作,避免不必要的麻烦. 进行例子程序tutorial目录下,通 ...

  2. for循环++i效率

    偶然用到for循环 注意查看了一下 ++i的速度更快 这是PHP语言独有的 其他语言不会有这种情况

  3. thinkphp 比对过去时间距离现在时间多少的问题

    <?php import('ORG.Util.Date');// 导入日期类 $Date = new Date();//实例化类 $time_diff = $Date->timeDiff( ...

  4. uva10829 L-Gap Substrings

    题意 给出一个长度为\(n(\leqslant 50000)\)的字符串,求形如\(\mathrm{UVU}\)形式的字串,其中\(\mathrm{V}\)的长度给定. 题解 枚举\(\mathrm{ ...

  5. uva1393 Highways

    留坑(p.339) 已填(膜汪) 每条直线至少经过两个点,我们不妨在经过的所有点中的第二个点统计它 设f[i][j]表示i * j的答案,那么显然可以用f[i][j] = f[i - 1][j] + ...

  6. hdu1043Eight (经典的八数码)(康托展开+BFS)

    建议先学会用康托展开:http://blog.csdn.net/u010372095/article/details/9904497 Problem Description The 15-puzzle ...

  7. 10个精妙的Java编码最佳实践

    这是一个比Josh Bloch的Effective Java规则更精妙的10条Java编码实践的列表.和Josh Bloch的列表容易学习并且关注日常情况相比,这个列表将包含涉及API/SPI设计中不 ...

  8. flume学习安装

    近期项目组有需求点击流日志须要自己收集,学习了一下flume而且成功安装了.相关信息记录一下. 1)下载flume1.5版本号  wget http://www.apache.org/dyn/clos ...

  9. android 20 Intnet类重要的成员变量

    Intnet类重要的成员变量: <intent-filter> <action android:name="android.intent.action.MAIN" ...

  10. lenky的个人站点 ----LINUX 内核进程

    http://www.lenky.info/archives/category/nix%E6%8A%80%E6%9C%AF/%E5%86%85%E6%A0%B8%E6%8A%80%E6%9C%AF