sorted()排序详解

 
 

http://wiki.python.org/moin/HowTo/Sorting?highlight=%28howto%29#The_Old_Way_Using_the_cmp_Parameter

一个列表存储了由数字组成的 字符串,比如 '21'
,如何对他们按照数字大小排序得到新列表呢?

l=['1','3','2','32','1','453','232']

l.sort(key = int)   # key = int,只按照数值大小进行比较

from operator import itemgetter,attrgetter
s = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10),]
 
print itemgetter(0,2)
 
print sorted(s,key=itemgetter(2))
 
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)) #根据元组的第二项进行排序,此处即字典的值

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 s : s[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  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)

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

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

相当于

  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)

In Py2.x, sort allowed an optional function which can be called for doing thecomparisons. That function should take two arguments to be compared andthen return a negative value for less-than, return zero if they are equal,or return a positive value for greater-than. For example, we can do:

>>> def numeric_compare(x, y):        return x - y>>> sorted([5, 2, 4, 1, 3], cmp=numeric_compare)[1, 2, 3, 4, 5]

Or you can reverse the order of comparison with:

>>> def reverse_numeric(x, y):        return y - x>>> sorted([5, 2, 4, 1, 3], cmp=reverse_numeric)[5, 4, 3, 2, 1]

list.sort() method is only defined for lists. In contrast, the sorted() function accepts anyiterable.

>>> sorted({1: 'D', 2: 'B', 3: 'B', 4: 'E', 5: 'A'})[1, 2, 3, 4, 5]

sorted()排序详解的更多相关文章

  1. PYTHON3-LIST.SORT(),SORTED()方法详解。

    python3对于排序提供两种内置方法,一是针对数组的list.sort(), 一是针对所有可迭代序列的sorted().其中list.sort()是在原数组修改,不产生新对象,所以在使用函数后使用赋 ...

  2. mapreduce二次排序详解

    什么是二次排序 待排序的数据具有多个字段,首先对第一个字段排序,再对第一字段相同的行按照第二字段排序,第二次排序不破坏第一次排序的结果,这个过程就称为二次排序. 如何在mapreduce中实现二次排序 ...

  3. Java 对象排序详解

    很难想象有Java开发人员不曾使用过Collection框架.在Collection框架中,主要使用的类是来自List接口中的ArrayList,以及来自Set接口的HashSet.TreeSet,我 ...

  4. Python sorted函数详解(高级篇)

    sorted() 函数对所有可迭代的对象进行排序操作. sort 与 sorted 区别: sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作. list 的 s ...

  5. js数组的sort排序详解

    <body> <div> sort()对数组排序,不开辟新的内存,对原有数组元素进行调换 </div> <div id="showBox" ...

  6. eayui datagrid 分页 排序 详解

    最近因为经常使用easyui 在做表格时难免后出现排序 及分页的问题,但是 在官网中没有 相关的介绍及例子,所以经过多方面的查找后,终于完成了分页 和排序的功能 首先 页面datagrid 要排序的必 ...

  7. java中Collections.sort排序详解

    Comparator是个接口,可重写compare()及equals()这两个方法,用于比价功能:如果是null的话,就是使用元素的默认顺序,如a,b,c,d,e,f,g,就是a,b,c,d,e,f, ...

  8. C# List.sort排序详解(多权重,升序降序)

    很多人可能喜欢Linq的orderBy排序,可惜U3D里面linq在Ios上会报错,所以就必须使用list的排序. 其实理解了并不难 升序降序比较 sort有三种结果 1,-1,0分别是大,小,相等. ...

  9. 计数排序详解以及java实现

    前言 我们知道,通过比较两个数大小来进行排序的算法(比如插入排序,合并排序,以及上文提到的快速排序等)的时间复杂度至少是Θ(nlgn),这是因为比较排序对应的决策树的高度至少是Θ(nlgn),所以排序 ...

随机推荐

  1. 洛谷 P1070 道路游戏 解题报告

    P1070 道路游戏 题目描述 小新正在玩一个简单的电脑游戏. 游戏中有一条环形马路,马路上有\(n\)个机器人工厂,两个相邻机器人工厂之间由一小段马路连接.小新以某个机器人工厂为起点,按顺时针顺序依 ...

  2. CodeForces 450B Jzzhu and Sequences (矩阵优化)

    CodeForces 450B Jzzhu and Sequences (矩阵优化) Description Jzzhu has invented a kind of sequences, they ...

  3. nginx代理服务器3--高可用(keepalived)

    keepalived即健康检查,不停的发送心跳包检查nginx是否活着.Nginx至少两台,一主一备.

  4. 利用CSS3实现简书中点击“喜欢”时的动画

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. fastJson顺序遍历JSON字段(转)

    fastJson在把json格式的字符串转换成JSONObject的时候,使用的是HashMap,所以排序规则是根据HASH值排序的,如果想要按照字符串顺序遍历JSON属性,需要在转换的时候指定使用L ...

  6. Linux 基础知识(一) shell的&&和|| 简单使用

    shell 在执行某个命令的时候,会返回一个返回值,该返回值保存在 shell 变量 $? 中.当 $? == 0 时,表示执行成功:当 $? == 1 时,表示执行失败.  有时候,下一条命令依赖前 ...

  7. 转载自知乎大神---this 的值到底是什么?一次说清楚

    你可能遇到过这样的 JS 面试题: var obj = { foo: function(){ console.log(this) } } var bar = obj.foo obj.foo() // ...

  8. Redis实战(八)Redis的配置文件介绍

    https://www.cnblogs.com/ysocean/p/9074787.html

  9. javascript有关this的那些事(某渣提出的问题)

    某人提出 请教下谁能解释下这个值var name = "The Window";        var object = {            name: "My O ...

  10. 通过vnc访问无显卡服务器的图形环境

    最近在一台没有显卡的 Power 服务器上,安装了Fedora 22,因为没有显卡,所以不能在本机启动Xserver,于是想通过vnc的方式远程访问服务器的图形环境. 在服务器上安装好xserver和 ...