排序,在编程中经常遇到的算法,我也在几篇文章中介绍了一些关于排序的算法。有的高级语言内置了一些排序函数。本文讲述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 "", line 1, in

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是威武的。

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

综上,可以看出,就一般情况,使用sorted足以能够完成排序的要求,并且是稳定的。

当然,python中也有其它一些排序模块,都可以直接拿过来使用。

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

原文:http://blog.csdn.net/qiwsir/article/details/36189171

python sorted排序原理_python的sorted排序详解相关推荐

  1. python lambda函数加法_python lambda的使用详解

    1. lambda语法 lambda argument_list: expression lambda是Python预留的关键字,argument_list(参数列表)和expression(关于参数 ...

  2. python编程序列类型_python序列类型种类详解

    python序列类型包括哪三种 python序列类型包括:列表.元组.字典 列表:有序可变序列 创建:userlist = [1,2,3,4,5,6] 修改:userlist[5] = 999 添加: ...

  3. python画笔粗细函数_Python 画图基础操作详解

    python 画图介绍 本文以实用为第一目标,保证读者在看完此文之后可以迅速上手 python 画图,掌握所有画图的基本技巧.(收藏的同时点个赞呗ヽ(•̀ω•́ )ゝ)库加载 我们使用 matplot ...

  4. python命名空间和闭包_Python函数基础实例详解【函数嵌套,命名空间,函数对象,闭包函数等】...

    本文实例讲述了Python函数基础用法.分享给大家供大家参考,具体如下: 一.什么是命名关键字参数? 格式: 在*后面参数都是命名关键字参数. 特点: 1.约束函数的调用者必须按照Kye=value的 ...

  5. python字典的用法_Python字典的用法详解(附示例)

    本篇文章给大家带来的内容是关于Python字典的用法详解(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 字典的表现形式为:{key:value},键和值之间用冒号分隔,每个 ...

  6. python做插件应用_Python插件机制实现详解

    插件机制是代码/功能反向依赖注入到主体程序的一种方法,编译型语言通过动态加载动态库实现插件.对于Python这样的脚本语言,实现插件机制更简单. 机制 Python的__import__方法可以动态地 ...

  7. python插件使用教程_Python插件机制实现详解

    插件机制是代码/功能反向依赖注入到主体程序的一种方法,编译型语言通过动态加载动态库实现插件.对于Python这样的脚本语言,实现插件机制更简单. 机制 Python的__import__方法可以动态地 ...

  8. python缩进和冒号_Python缩进和冒号详解

    对于Python而言代码缩进是一种语法,Python没有像其他语言一样采用{}或者begin...end分隔代码块,而是采用代码缩进和冒号来区分代码之间的层次. 缩进的空白数量是可变的,但是所有代码块 ...

  9. python加载机制_Python插件机制实现详解

    插件机制是代码/功能反向依赖注入到主体程序的一种方法,编译型语言通过动态加载动态库实现插件.对于Python这样的脚本语言,实现插件机制更简单. 机制 Python的__import__方法可以动态地 ...

  10. python数据挖掘商业案例_Python数据科学-技术详解与商业实践-第八讲作业

    作者:Ben,著有<Python数据科学:技术详解与商业实践>.<用商业案例学R语言数据挖掘>.<胸有成竹-数据分析的SAS EG进阶>作者.2005年进入数据科学 ...

最新文章

  1. mysql开启skip-name-resolve 导致root@127.0.0.1(localhost)访问引发的ERROR 1045 (28000)错误解决方案...
  2. 复习1 - String,StringBuilder,StringBuffer的执行效率区别
  3. lingo变量无限制版本_LINGO笔记
  4. 修改Sublime Text3 的侧边栏字体大小
  5. 疯狂java学习笔记之面向对象(二) - 成员变量与局部变量
  6. SolarWinds 升级 APM Suite,简化应用程序和基础架构管理!
  7. 用python建立三元一次方程_python简单的三元一次方程求解实例
  8. MySQL数据库将多条记录的单个字段合并成一条记录(GROUP_CONCAT)
  9. forge java7_1.构建forge
  10. 喜欢蓝蓝的天空白白的云。这首《 Blue Skies》就是啦。
  11. 2合1笔记本 android,华为二合一笔记本支持Android可能是鸡肋
  12. flutter之出现 List is not a subtype of type 问题
  13. Git GUI中文乱码解决问题
  14. python 股票实时数据接口_股票行情实时数据接口
  15. Google野心勃勃,微软前程堪忧!(转)
  16. 中国正式进入 5G 商用元年!
  17. selenium+python抓取微博时遇到“展开全文”
  18. 充电电流用软件测试准吗,充电设备 篇一:一次不严谨的测试,但估计iPhone用户看了都会买...
  19. [范式]数据库-范式
  20. StarUML——一款在MAC上的UML软件

热门文章

  1. python模拟操作,python如何实现模拟键盘操作
  2. 各行业的英语术语(绝对精华 1)
  3. GitHub AI 编程工具自动写代码神器Copilot插件体验
  4. 大数据可视化学期总结
  5. WhatsApp即时翻译WhatsApp聊天自动翻译成中文
  6. 西安大略电子与计算机工程专业,2020年西安大略大学电子与计算机工程(工程科学硕士, 工程硕士)专业硕士申请条件-学费-世界排名...
  7. CSDN日报20170602 ——《程序员、技术主管和架构师》
  8. 华为路由器配置OSPF实现不同网段通信
  9. 微信小游戏上线发布全流程详解
  10. SuperMap三维复杂模型建模之3D极坐标建模——基础篇