Python中利用sorted()函数排序的简单教程


Posted in Python onApril 27, 2015

排序算法

排序也是在程序中经常用到的算法。无论使用冒泡排序还是快速排序,排序的核心是比较两个元素的大小。如果是数字,我们可以直接比较,但如果是字符串或者两个dict呢?直接比较数学上的大小是没有意义的,因此,比较的过程必须通过函数抽象出来。通常规定,对于两个元素x和y,如果认为x < y,则返回-1,如果认为x == y,则返回0,如果认为x > y,则返回1,这样,排序算法就不用关心具体的比较过程,而是根据比较结果直接排序。

Python内置的sorted()函数就可以对list进行排序:

>>> sorted([36, 5, 12, 9, 21])
[5, 9, 12, 21, 36]

此外,sorted()函数也是一个高阶函数,它还可以接收一个比较函数来实现自定义的排序。比如,如果要倒序排序,我们就可以自定义一个reversed_cmp函数:

def reversed_cmp(x, y):
  if x > y:
    return -1
  if x < y:
    return 1
  return 0

传入自定义的比较函数reversed_cmp,就可以实现倒序排序:

>>> sorted([36, 5, 12, 9, 21], reversed_cmp)
[36, 21, 12, 9, 5]

我们再看一个字符串排序的例子:

>>> sorted(['bob', 'about', 'Zoo', 'Credit'])
['Credit', 'Zoo', 'about', 'bob']

默认情况下,对字符串排序,是按照ASCII的大小比较的,由于'Z' < 'a',结果,大写字母Z会排在小写字母a的前面。

现在,我们提出排序应该忽略大小写,按照字母序排序。要实现这个算法,不必对现有代码大加改动,只要我们能定义出忽略大小写的比较算法就可以:

def cmp_ignore_case(s1, s2):
  u1 = s1.upper()
  u2 = s2.upper()
  if u1 < u2:
    return -1
  if u1 > u2:
    return 1
  return 0

忽略大小写来比较两个字符串,实际上就是先把字符串都变成大写(或者都变成小写),再比较。

这样,我们给sorted传入上述比较函数,即可实现忽略大小写的排序:

>>> sorted(['bob', 'about', 'Zoo', 'Credit'], cmp_ignore_case)
['about', 'bob', 'Credit', 'Zoo']

从上述例子可以看出,高阶函数的抽象能力是非常强大的,而且,核心代码可以保持得非常简洁。

Python 相关文章推荐
Python学习小技巧之列表项的排序
May 20 Python
Python下调用Linux的Shell命令的方法
Jun 12 Python
Python发展史及网络爬虫
Jun 19 Python
使用Filter过滤python中的日志输出的实现方法
Jul 17 Python
10行Python代码计算汽车数量的实现方法
Oct 23 Python
Pandas-Cookbook 时间戳处理方式
Dec 07 Python
python 通过视频url获取视频的宽高方式
Dec 10 Python
Python加密模块的hashlib,hmac模块使用解析
Jan 02 Python
python安装dlib库报错问题及解决方法
Mar 16 Python
Django中F函数的使用示例代码详解
Jul 06 Python
基于Python的一个自动录入表格的小程序
Aug 05 Python
python爬虫scrapy基本使用超详细教程
Feb 20 Python
Python中的filter()函数的用法
Apr 27 #Python
Python中的map()函数和reduce()函数的用法
Apr 27 #Python
PyMongo安装使用笔记
Apr 27 #Python
Windows下PyMongo下载及安装教程
Apr 27 #Python
Python操作MongoDB数据库PyMongo库使用方法
Apr 27 #Python
Python的函数的一些高阶特性
Apr 27 #Python
Python简单进程锁代码实例
Apr 27 #Python
You might like
PHP可变函数的使用详解
2013/06/14 PHP
IIS安装Apache伪静态插件的具体操作图文
2013/07/01 PHP
php数组遍历类与用法示例
2019/05/24 PHP
php求斐波那契数的两种实现方式【递归与递推】
2019/09/09 PHP
javascript自动改变文字大小和颜色的效果的小例子
2013/08/02 Javascript
js控制再次点击按钮之间的间隔时间可防止重复提交
2014/08/01 Javascript
JavaScript动态修改背景颜色的方法
2015/04/16 Javascript
可以浮动某个物体的jquery控件用法实例
2015/07/24 Javascript
基于jQuery实现收缩展开功能
2016/03/18 Javascript
node.js 动态执行脚本
2016/06/02 Javascript
javascript实现图片左右滚动效果【可自动滚动,有左右按钮】
2016/09/19 Javascript
json定义及jquery操作json的方法
2016/10/03 Javascript
jQuery中弹出iframe内嵌页面元素到父页面并全屏化的实例代码
2016/12/27 Javascript
简述jQuery Easyui一些用法
2017/08/01 jQuery
jquery自定义显示消息数量
2017/12/19 jQuery
Vue2.0子同级组件之间数据交互方法
2018/02/28 Javascript
AjaxFileUpload.js实现异步上传文件功能
2019/04/19 Javascript
layui button 按钮弹出提示窗口,确定才进行的方法
2019/09/06 Javascript
实例讲解React 组件
2020/07/07 Javascript
vue print.js打印支持Echarts图表操作
2020/11/13 Javascript
Python 命令行非阻塞输入的小例子
2013/09/27 Python
python实现目录树生成示例
2014/03/28 Python
Python的类实例属性访问规则探讨
2015/01/30 Python
python中正则表达式与模式匹配
2019/05/07 Python
python itsdangerous模块的具体使用方法
2020/02/17 Python
python对批量WAV音频进行等长分割的方法实现
2020/09/25 Python
细说CSS3中的选择符
2008/10/17 HTML / CSS
KIKO MILANO英国官网:意大利知名化妆品和护肤品品牌
2017/09/25 全球购物
汽车检测与维修个人求职信
2013/09/24 职场文书
外国语学院毕业生自荐信
2013/10/28 职场文书
大二学生学年自我鉴定
2014/09/12 职场文书
大一工商管理职业生涯规划:有梦最美,行动相随
2014/09/18 职场文书
赔偿协议书怎么写
2015/01/28 职场文书
详解MySQL中的pid与socket
2021/06/15 MySQL
sql注入教程之类型以及提交注入
2021/08/02 MySQL
Java GUI编程菜单组件实例详解
2022/04/07 Java/Android