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正常时间和unix时间戳相互转换的方法
Apr 23 Python
Python找出9个连续的空闲端口
Feb 01 Python
python中requests和https使用简单示例
Jan 18 Python
python中正则表达式 re.findall 用法
Oct 23 Python
更改Python的pip install 默认安装依赖路径方法详解
Oct 27 Python
Python使用crontab模块设置和清除定时任务操作详解
Apr 09 Python
PyCharm搭建Spark开发环境实现第一个pyspark程序
Jun 13 Python
浅谈python输出列表元素的所有排列形式
Feb 26 Python
Python fileinput模块如何逐行读取多个文件
Oct 05 Python
python实现自动打卡的示例代码
Oct 10 Python
pandas 数据类型转换的实现
Dec 29 Python
Python基于爬虫实现全网搜索并下载音乐
Feb 14 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写的带缓存数据功能的mysqli类
2012/09/06 PHP
PHP提示Deprecated: mysql_connect(): The mysql extension is deprecated的解决方法
2014/08/28 PHP
php+mysql数据库查询实例
2015/01/21 PHP
Laravel多域名下字段验证的方法
2019/04/04 PHP
Ext javascript建立超链接,进行事件处理的实现方法
2009/03/22 Javascript
json 实例详细说明教程
2009/10/31 Javascript
修改jquery.lazyload.js实现页面延迟载入
2010/12/22 Javascript
jQuery使用ajaxSubmit()提交表单示例
2014/04/04 Javascript
JavaScript DOM元素尺寸和位置
2015/04/13 Javascript
JavaScript实现鼠标点击后层展开效果的方法
2015/05/13 Javascript
jQuery通过ajax请求php遍历json数组到table中的代码(推荐)
2016/06/12 Javascript
JS使用单链表统计英语单词出现次数
2016/06/16 Javascript
JavaScript实现简单的星星评分效果
2017/05/18 Javascript
swiper自定义分页器使用方法详解
2020/09/14 Javascript
详解如何在vscode里面调试js和node.js的方法步骤
2018/12/24 Javascript
怎样使你的 JavaScript 代码简单易读(推荐)
2019/04/16 Javascript
Javascript三种字符串连接方式及性能比较
2019/05/28 Javascript
jQuery内容选择器与表单选择器实例分析
2019/06/28 jQuery
原生JavaScript之es6中Class的用法分析
2020/02/23 Javascript
JavaScript大数相加相乘的实现方法实例
2020/10/18 Javascript
Js利用正则表达式去除字符串的中括号
2020/11/23 Javascript
[01:01:24]DOTA2上海特级锦标赛A组败者赛 EHOME VS CDEC第三局
2016/02/25 DOTA
[49:28]VP vs Optic 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python字符串匹配算法KMP实例
2015/07/18 Python
详解python 字符串和日期之间转换 StringAndDate
2017/05/04 Python
Opencv+Python 色彩通道拆分及合并的示例
2018/12/08 Python
Django框架使用mysql视图操作示例
2019/05/15 Python
对Python获取屏幕截图的4种方法详解
2019/08/27 Python
Python Django中间件,中间件函数,全局异常处理操作示例
2019/11/08 Python
HTML5 Canvas绘制五星红旗
2016/05/04 HTML / CSS
美国Randolph太阳镜官网:美国制造的飞行员太阳镜和射击眼镜
2018/06/15 全球购物
2014办公室副主任四风对照检查材料思想汇报
2014/09/20 职场文书
师范生见习总结范文
2015/06/23 职场文书
Python 多线程之threading 模块的使用
2021/04/14 Python
Pytest之测试命名规则的使用
2021/04/16 Python
Lombok的详细使用及优缺点总结
2021/07/15 Java/Android