sorted() 详解

简单记一下python中List的sort方法(或者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排序

Python代码  

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

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

Python代码  

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

用cmp函数排序

Python代码  

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

年龄倒序(详见末尾):

  1. >>> sorted(students, cmp=lambda x,y : cmp(y[2], x[2])) # sort by age desc,交换x/y的位置
  2. [(‘john‘, ‘A‘, 15), (‘jane‘, ‘B‘, 12),(‘dave‘, ‘B‘, 10)]

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

Python代码  

students = [(‘john‘, ‘A‘, 15), (‘jane‘, ‘B‘, 12), (‘dave‘, ‘B‘, 10),]

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

用 operator 函数进行多级排序

Python代码  

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

2. 对由字典排序

Python代码  

  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)]

from operator import itemgetter,attrgetter
d = {‘data1‘:3,‘data2‘:1,‘data3‘:2,‘data4‘:4}

print d.items()
print sorted(d.iteritems(),key = itemgetter(0)) #根据字典的键进行排序
print sorted(d.iteritems(),key = itemgetter(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])

相当于

Python代码  

  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)
时间: 2024-10-02 16:08:38

sorted() 详解的相关文章

Python 列表排序方法reverse、sort、sorted详解

python语言中的列表排序方法有三个:reverse反转/倒序排序.sort正序排序.sorted可以获取排序后的列表.在更高级列表排序中,后两中方法还可以加入条件参数进行排序. reverse()方法 将列表中元素反转排序,比如下面这样 1 2 3 4 >>> x = [1,5,2,3,4] >>> x.reverse() >>> x [4, 3, 2, 5, 1] reverse列表反转排序:是把原列表中的元素顺序从左至右的重新存放,而不会对列表

python的sorted排序详解

排序,在编程中经常遇到的算法,我也在几篇文章中介绍了一些关于排序的算法.有的高级语言内置了一些排序函数.本文讲述Python在这方面的工作.供使用python的程序员们参考,也让没有使用python的朋友了解python.领略一番"生命有限,请用Python"的含义. 内置函数sorted()/list.sort()的使用 简单应用 python对list有一个内置函数:sorted(),专门用于排序.举例: >>> a=[5,3,6,1,9,2] >>&

Redis详解:sorted sets数据类型及操作

sorted set是set的一个升级版本,它在set的基础上增加了一个顺序属性,这一属性在添加修改元素的时候可以指定,每次指定后,zset会自动重新按新的值调整顺序.可以理解为有两列的mysql表,一列存value,一列存顺序.操作中key理解为zset的名字. 系列文章: Redis详解:strings数据类型及操作 Redis详解:hashes数据类型及操作 Redis详解:lists数据类型及操作 Redis详解:sets数据类型及操作 和set一样sorted set也是string类

Hadoop Hive sql语法详解

Hive 是基于Hadoop 构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop 分布式文件系统中的数据,可以将结构化的数据文件映射为一张数据库表,并提供完整的SQL查询功能,可以将SQL语句转换为MapReduce任务进行运行,通过自己的SQL 去查询分析需要的内容,这套SQL 简称Hive SQL,使不熟悉mapreduce 的用户很方便的利用SQL 语言查询,汇总,分析数据.而mapreduce开发人员可以把己写的mapper 和reducer 作为插件来支持

Python内置函数详解

置顶   内置函数详解 https://docs.python.org/3/library/functions.html?highlight=built#ascii 此文参考了别人整理好的东西(地址:http://www.cnblogs.com/sesshoumaru/p/6140987.html#p1),然后结合自己的理解,写下来,一方面方便自己,让自己好好学习,顺便回忆回忆:另一方面,让喜欢的盆友也参考一下. 经查询,3.6版本总共有68个内置函数,主要分类如下: 数学运算(7个) 类型转换

自学Python-内置函数详解

一.内置函数(python3.x) 内置参数详解官方文档: https://docs.python.org/3/library/functions.html?highlight=built#ascii 一.数学运算类 abs(x) 求绝对值1.参数可以是整型,也可以是复数2.若参数是负数,则返回负数的模 complex([real[, imag]]) 创建一个复数 divmod(a, b) 分别取商和余数注意:整型.浮点型都可以 float([x]) 将一个字符串或数转换为浮点数.如果无参数将返

Influxdb原理详解

本文属于<InfluxDB系列教程>文章系列,该系列共包括以下 15 部分: InfluxDB学习之InfluxDB的安装和简介 InfluxDB学习之InfluxDB的基本概念 InfluxDB学习之InfluxDB的基本操作 InfluxDB学习之InfluxDB的HTTP API写入操作 InfluxDB学习之InfluxDB数据保留策略(Retention Policies) InfluxDB学习之InfluxDB连续查询(Continuous Queries) InfluxDB学习之

linux下redis与phpredis安装详解与简单操作

首先下载redis安装包 [[email protected] ~]#wget http://download.redis.io/releases/redis-3.0.2.tar.gz [[email protected] ~]# tar xzf redis-3.0.2].tar.gz [[email protected] ~]# cd redis-3.0.2 [[email protected] redis-3.0.2]#ls [[email protected] redis-3.0.2]#m

C++仿函数(functor)详解

C++仿函数(functor)详解 所谓的仿函数(functor),是通过重载()运算符模拟函数形为的类. 因此,这里需要明确两点: 1 仿函数不是函数,它是个类: 2 仿函数重载了()运算符,使得它的对你可以像函数那样子调用(代码的形式好像是在调用 函数). 看下面的实例: #include <iostream> using namespace std; const int CMP_LES = -1; const int CMP_EQU = 0; const int CMP_BIG = 1;