排序。在编程中常常遇到的算法。我也在几篇文章中介绍了一些关于排序的算法。

有的高级语言内置了一些排序函数。本文讲述Python在这方面的工作。供使用python的程序猿们參考,也让没有使用python的朋友了解python。

领略一番“生命有限,请用Python”的含义。

内置函数sorted()/list.sort()的使用

简单应用

python对list有一个内置函数:sorted(),专门用于排序。

举例:

>>> a=[5,3,6,1,9,2]
>>> sorted(a) #a经过sorted之后。得到一个排序结果
[1, 2, 3, 5, 6, 9] #可是,原有的a并没有受到影响
>>> a
[5, 3, 6, 1, 9, 2]

也能够使用list.sort()来进行上述操作。

>>> a.sort()
>>> a #注意这里,经过list.sort()之后,原有
[1, 2, 3, 5, 6, 9] #a的顺序已经发生变化。与上述不同之处。

sorted和list.sort()的差别:list.sort()仅仅能对list类型进行排序。例如以下:

>>> b_dict={1:'e',3:'m',9:'a',5:'e'}
>>> b_dict.sort()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'dict' object has no attribute 'sort'

而sorted则不然。看样例:

>>> b_dict
{1: 'e', 3: 'm', 5: 'e', 9: 'a'}
>>> sorted(b_dict)
[1, 3, 5, 9]

sorted之后。上述对dictinoary中,将key值取出并排序,返回list类型的排序结果。

依照指定关键词排序

在list.sort()和sorted中,都能够依据指定的key值排序。比如:

sorted的样例:

>>> qw="I am Qiwsir you can read my articles im my blog".split()
>>> qw
['I', 'am', 'Qiwsir', 'you', 'can', 'read', 'my', 'articles', 'im', 'my', 'blog']
>>> sorted(qw,key=str.lower) #依照字母升序排列
['am', 'articles', 'blog', 'can', 'I', 'im', 'my', 'my', 'Qiwsir', 'read', 'you']

list.sort()的样例:

>>> qw
['I', 'am', 'Qiwsir', 'you', 'can', 'read', 'my', 'articles', 'im', 'my', 'blog']
>>> qw.sort(key=str.lower)
>>> qw
['am', 'articles', 'blog', 'can', 'I', 'im', 'my', 'my', 'Qiwsir', 'read', 'you']

此外,key还能够接收函数的单一返回值。依照该值排序。比如:

>>> name_mark_age = [('zhangsan','A',15),('LISI','B',14),('WANGWU','A',16)]
>>> sorted(name_mark_age, key = lambda x: x[2]) #依据年龄排序
[('LISI', 'B', 14), ('zhangsan', 'A', 15), ('WANGWU', 'A', 16)] >>> sorted(name_mark_age, key = lambda x: x[1]) #依据等级排序
[('zhangsan', 'A', 15), ('WANGWU', 'A', 16), ('LISI', 'B', 14)] >>> sorted(name_mark_age, key = lambda x: x[0]) #依据姓名排序
[('LISI', 'B', 14), ('WANGWU', 'A', 16), ('zhangsan', 'A', 15)]

除了上述方式。python中还提供了一个选择循环选择指定元组值的模块。官方文档:https://docs.python.org/2/library/operator.html#module-operator

>>> from operator import itemgetter    

>>> name_mark_age
[('zhangsan', 'A', 15), ('LISI', 'B', 14), ('WANGWU', 'A', 16), ('zhaoliu', 'B', 16)] >>> sorted(name_mark_age,key=itemgetter(2)) #依照年龄排序
[('LISI', 'B', 14), ('zhangsan', 'A', 15), ('WANGWU', 'A', 16), ('zhaoliu', 'B', 16)] >>> sorted(name_mark_age,key=itemgetter(1,2)) #先依照等级排序,同样等级看年龄
[('zhangsan', 'A', 15), ('WANGWU', 'A', 16), ('LISI', 'B', 14), ('zhaoliu', 'B', 16)]

在官方文档上。有这样一个样例,和上面的操作是全然一样的。

>>> class Student:
def __init__(self, name, grade, age):
self.name = name
self.grade = grade
self.age = age def __repr__(self):
return repr((self.name, self.grade, self.age)) >>> student_objects = [
Student('john', 'A', 15), #注意这里,用class Student来生成列表内的值
Student('jane', 'B', 12), #因此,能够通过student_objects[i].age来訪问某个名称的年龄,i=0,则是john的年龄
Student('dave', 'B', 10),
] >>> sorted(student_objects, key=lambda student: student.age)
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

也能够引用operator模块来实现上述排序

>>>from operator import attrgetter
>>> sorted(student_objects, key=attrgetter('age'))
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
>>> sorted(student_objects, key=attrgetter('grade', 'age'))
[('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]

**总结:**sorted的能力超强,不仅实现排序,还能依照指定关键词排序。

以上样例都是升序。假设,添加reverse=True。比如:

>>>from operator import itemgetter
>>> name_mark_age
[('zhangsan', 'A', 15), ('LISI', 'B', 14), ('WANGWU', 'A', 16), ('zhaoliu', 'B', 16)]
>>> sorted(name_mark_age, key=itemgetter(2),reverse=True)
[('WANGWU', 'A', 16), ('zhaoliu', 'B', 16), ('zhangsan', 'A', 15), ('LISI', 'B', 14)]

sorted的算法

python中的sorted算法。网上有人撰文,说比較低级。事实上不然,通过阅读官方文档。发现python中的sorted排序。真的是高大上,用的Timsort算法。什么是Timsort,请看 wiki的解释:http://en.wikipedia.org/wiki/Timsort,另外,国内有一个文档,适当翻译:http://blog.csdn.net/yangzhongblog/article/details/8184707。这里截取一个不同排序算法比較的图示。就明确sorted的威力了。

从时间复杂度来看,Timsort是威武的。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcWl3c2ly/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />

从空间复杂度来讲,须要的开销在数量大的时候会增大。

综上,能够看出,就普通情况。使用sorted足以能够完毕排序的要求。而且是稳定的。

当然,python中也有其他一些排序模块。都能够直接拿过来使用。

本文作者在博客和github上都有多种关于python排序方法和模块的文章说明。

python的sorted排序具体解释的更多相关文章

  1. python dict sorted 排序

    https://www.cnblogs.com/linyawen/archive/2012/03/15/2398292.html 我们知道Python的内置dictionary数据类型是无序的,通过k ...

  2. 深入Python(1): 字典排序 关于sort()、reversed()、sorted()

    http://www.cnblogs.com/BeginMan/p/3193081.html 一.Python的排序 1.reversed() 这个很好理解,reversed英文意思就是:adj. 颠 ...

  3. python sorted排序

    python sorted排序 Python不仅提供了list.sort()方法来实现列表的排序,而且提供了内建sorted()函数来实现对复杂列表的排序以及按照字典的key和value进行排序. s ...

  4. python sorted排序用法详解

    sorted排序 python sorted 排序 1. operator函数在介绍sorted函数之前需要了解一下operator函数. operator函数是python的内置函数,提供了一系列常 ...

  5. python中sorted()和set()去重,排序

    前言 在看一个聊天机器人的神经网络模型训练前准备训练数据,需要对训练材料做处理(转化成张量)需要先提炼词干,然后对词干做去重和排序 words = sorted(list(set(words))) 对 ...

  6. python高阶函数——sorted排序算法

    python 内置的sorted()函数可以对一个list进行排序: >>> sorted([8,3,8,11,-2]) [-2, 3, 8, 8, 11] 既然说是高阶函数,那么它 ...

  7. Python中自定义类未定义__lt__方法使用sort/sorted排序会怎么处理?

    在<第8.23节 Python中使用sort/sorted排序与"富比较"方法的关系分析>中介绍了排序方法sort和函数sorted在没有提供key参数的情况下默认调用 ...

  8. python中的sort、sorted排序

    我们通常会遇到对数据库中的数据进行排序的问题,今天学习一下对列表和字典的排序方法. 列表 第一种:内建方法sort sort()对列表排序是永久性的排序. 用法:sort(*, key=None, r ...

  9. Python中sorted()方法

    Python中sorted()方法的用法 1.先说一下iterable,中文意思是迭代器. Python的帮助文档中对iterable的解释是:iteralbe指的是能够一次返回它的一个成员的对象.i ...

随机推荐

  1. Python基础---三大推导式

    推导式comprehensions(又称解析式),是Python的一种独有特性.推导式是可以从一个数据结构构建另一个新的数据结构的结构体. 共有三种推导,在Python2和3中都有支持: 列表(lis ...

  2. 《数据结构与算法分析——C语言描述》ADT实现(NO.00) : 链表(Linked-List)

    开始学习数据结构,使用的教材是机械工业出版社的<数据结构与算法分析——C语言描述>,计划将书中的ADT用C语言实现一遍,记录于此.下面是第一个最简单的结构——链表. 链表(Linked-L ...

  3. 用sqoop抽取oracle 表到hbase的例子

    sqoop import \-Doraoop.disabled=true \--connect jdbc:oracle:thin:@"(DESCRIPTION=(ADDRESS=(PROTO ...

  4. POJ 2533 最小上升子序列

    D - POJ 2533 经典DP-最长上升子序列 A numeric sequence of ai is ordered if a1 < a2 < ... < aN. Let th ...

  5. Leetcode131. Palindrome Partitioning分割回文串

    给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回 s 所有可能的分割方案. 示例: 输入: "aab" 输出: [ ["aa",&quo ...

  6. 跟我一起了解koa(一)

    安装koa2 1.初始化package.json npm init 2.新建app.js,并且安装koa cnpm install --save koa //app.js const koa = re ...

  7. 【html、CSS、javascript-9】jquery-选择器及过滤器

    一.选择器与过滤器 选择器 实例 选取 * $("*") 所有元素 #id $("#lastname") id="lastname" 的元素 ...

  8. 使用setTimeout函数解决栈溢出问题

    下面的代码,如果队列太长会导致栈溢出,怎样解决这个问题并且依然保持循环部分: var list = readHugeList(); var nextListItem = function() { va ...

  9. Web基础了解版06-Jsp

    Jsp Jsp全称Java Server Pages,也就是在我们JavaWeb中的动态页面. Jsp能够以HTML页面的方式呈现数据,是一个可以嵌入Java代码的HTML. Jsp其本质就是一个Se ...

  10. 论ul、ol和dl的区别

    1.ul是无序列表,也就是说没有排列限制可以随意加li: <ul> <li>可以随意放置</li> <li>可以随意放置</li> < ...