Python中对列表排序实例


Posted in Python onJanuary 04, 2015

很多时候,我们需要对List进行排序,Python提供了两个方法,对给定的List L进行排序:

方法1.用List的成员函数sort进行排序
方法2.用built-in函数sorted进行排序(从2.4开始)

这两种方法使用起来差不多,以第一种为例进行讲解:

从Python2.4开始,sort方法有了三个可选的参数,Python Library Reference里是这样描述的

cmp:cmp specifies a custom comparison function of two arguments (iterable elements) which should return a negative, zero or positive number depending on whether the first argument is considered smaller than, equal to, or larger than the second argument: 

"cmp=lambda x,y: cmp(x.lower(), y.lower())" 

key:key specifies a function of one argument that is used to extract a comparison key from each list element: "key=str.lower"

reverse:reverse is a boolean value. If set to True, then the list elements are sorted as if each comparison were reversed.In general, the key and reverse conversion processes are much faster than specifying an 

equivalent cmp function. This is because cmp is called multiple times for each list element while key and reverse touch each element only once.

以下是sort的具体实例。
实例1:
>>>L = [2,3,1,4]

>>>L.sort()

>>>L

>>>[1,2,3,4]

实例2:
>>>L = [2,3,1,4]

>>>L.sort(reverse=True)

>>>L

>>>[4,3,2,1]

实例3:
>>>L = [('b',2),('a',1),('c',3),('d',4)]

>>>L.sort(cmp=lambda x,y:cmp(x[1],y[1]))

>>>L

>>>[('a', 1), ('b', 2), ('c', 3), ('d', 4)]

实例4:
>>>L = [('b',2),('a',1),('c',3),('d',4)]

>>>L.sort(key=lambda x:x[1])

>>>L

>>>[('a', 1), ('b', 2), ('c', 3), ('d', 4)]

实例5:
>>>L = [('b',2),('a',1),('c',3),('d',4)]

>>>import operator

>>>L.sort(key=operator.itemgetter(1))

>>>L

>>>[('a', 1), ('b', 2), ('c', 3), ('d', 4)]

实例6:(DSU方法:Decorate-Sort-Undercorate)
>>>L = [('b',2),('a',1),('c',3),('d',4)]

>>>A = [(x[1],i,x) for i,x in enumerate(L)] #i can confirm the stable sort

>>>A.sort()

>>>L = [s[2] for s in A]

>>>L

>>>[('a', 1), ('b', 2), ('c', 3), ('d', 4)]

以上给出了6中对List排序的方法,其中实例3.4.5.6能起到对以List item中的某一项
为比较关键字进行排序.
效率比较:
cmp < DSU < key

通过实验比较,方法3比方法6要慢,方法6比方法4要慢,方法4和方法5基本相当
多关键字比较排序:
实例7:
>>>L = [('d',2),('a',4),('b',3),('c',2)]

>>> L.sort(key=lambda x:x[1])

>>> L

>>>[('d', 2), ('c', 2), ('b', 3), ('a', 4)]

我们看到,此时排序过的L是仅仅按照第二个关键字来排的,如果我们想用第二个关键字
排过序后再用第一个关键字进行排序呢?有两种方法
实例8:
>>> L = [('d',2),('a',4),('b',3),('c',2)]

>>> L.sort(key=lambda x:(x[1],x[0]))

>>> L

>>>[('c', 2), ('d', 2), ('b', 3), ('a', 4)]

实例9:
>>> L = [('d',2),('a',4),('b',3),('c',2)]

>>> L.sort(key=operator.itemgetter(1,0))

>>> L

>>>[('c', 2), ('d', 2), ('b', 3), ('a', 4)]

为什么实例8能够工作呢?原因在于tuple是的比较从左到右之一比较的,比较完第一个,如果
相等,比较第二个
Python 相关文章推荐
python基于pygame实现响应游戏中事件的方法(附源码)
Nov 11 Python
Python用list或dict字段模式读取文件的方法
Jan 10 Python
基于Python log 的正确打开方式
Apr 28 Python
Python OpenCV处理图像之图像像素点操作
Jul 10 Python
Python 2.7中文显示与处理方法
Jul 16 Python
利用python循环创建多个文件的方法
Oct 25 Python
用pyqt5 给按钮设置图标和css样式的方法
Jun 24 Python
python paramiko远程服务器终端操作过程解析
Dec 14 Python
Python3 集合set入门基础
Feb 10 Python
Python3 mmap内存映射文件示例解析
Mar 23 Python
解决TensorFlow调用Keras库函数存在的问题
Jul 06 Python
Python使用Opencv打开笔记本电脑摄像头报错解问题及解决
Jun 21 Python
Python实现爬取知乎神回复简单爬虫代码分享
Jan 04 #Python
Python连接mssql数据库编码问题解决方法
Jan 01 #Python
Python中optparse模块使用浅析
Jan 01 #Python
Python中urllib2模块的8个使用细节分享
Jan 01 #Python
Python读取ini文件、操作mysql、发送邮件实例
Jan 01 #Python
Python实现检测服务器是否可以ping通的2种方法
Jan 01 #Python
Python Web框架Flask信号机制(signals)介绍
Jan 01 #Python
You might like
PHP If Else(elsefi) 语句
2013/04/07 PHP
解析php中array_merge与array+array的区别
2013/06/21 PHP
PHP加密解密类实例代码
2016/07/20 PHP
SCP远程VPS快速搬家和WDCP升级php5.3安装memcached和eaccelerator教程
2017/07/27 PHP
php微信开发之关注事件
2018/06/14 PHP
基于PHP实现解密或加密Cloudflar邮箱保护
2020/06/24 PHP
理解Javascript_10_对象模型
2010/10/16 Javascript
js实现百度联盟中一款不错的图片切换效果完整实例
2015/03/04 Javascript
jsonp跨域请求数据实现手机号码查询实例分析
2015/12/12 Javascript
jquery $.trim()去除字符串空格的实现方法【附图例】
2016/03/30 Javascript
javascript获取select标签选中的值
2016/06/04 Javascript
JS判断iframe是否加载完成的方法
2016/08/03 Javascript
理解AngularJs篇:30分钟快速掌握AngularJs
2016/12/23 Javascript
关于vue v-for循环解决img标签的src动态绑定问题
2018/09/18 Javascript
基于vue-upload-component封装一个图片上传组件的示例
2018/10/16 Javascript
详解BootStrap表单验证中重置BootStrap-select验证提示不清除的坑
2019/09/17 Javascript
webpack.DefinePlugin与cross-env区别详解
2020/02/23 Javascript
Python UnicodeEncodeError: 'gbk' codec can't encode character 解决方法
2015/04/24 Python
Python控制多进程与多线程并发数总结
2016/10/26 Python
Python数据结构之图的应用示例
2018/05/11 Python
python 递归深度优先搜索与广度优先搜索算法模拟实现
2018/10/22 Python
Python正则表达式和元字符详解
2018/11/29 Python
Python BeautifulSoup [解决方法] TypeError: list indices must be integers or slices, not str
2019/08/07 Python
python 微信好友特征数据分析及可视化
2020/01/07 Python
python多线程实现同时执行两个while循环的操作
2020/05/02 Python
pycharm中如何自定义设置通过“ctrl+滚轮”进行放大和缩小实现方法
2020/09/16 Python
css3 transform过渡抖动问题解决
2020/10/23 HTML / CSS
欧铁通票官方在线销售网站:Eurail.com
2017/10/14 全球购物
英语专业毕业生自我鉴定
2013/11/09 职场文书
园林设计师自荐信
2013/11/18 职场文书
实习评语大全
2014/04/26 职场文书
派出所正风肃纪剖析材料
2014/10/10 职场文书
2015年初中生自我评价范文
2015/03/03 职场文书
Python入门之使用pandas分析excel数据
2021/05/12 Python
Nginx缓存设置案例详解
2021/09/15 Servers
vue+iview实现手机号分段输入框
2022/03/25 Vue.js