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 文件读写操作实例详解
Mar 12 Python
使用基于Python的Tornado框架的HTTP客户端的教程
Apr 24 Python
Python科学计算之Pandas详解
Jan 15 Python
Python日期时间Time模块实例详解
Apr 15 Python
Python 3.8新特征之asyncio REPL
May 28 Python
python用for循环求和的方法总结
Jul 08 Python
python爬虫 urllib模块反爬虫机制UA详解
Aug 20 Python
详解mac python+selenium+Chrome 简单案例
Nov 08 Python
Python单元测试及unittest框架用法实例解析
Jul 09 Python
Prometheus开发中间件Exporter过程详解
Nov 30 Python
Python爬虫自动化获取华图和粉笔网站的错题(推荐)
Jan 08 Python
利用 Python 的 Pandas和 NumPy 库来清理数据
Apr 13 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+Ajax实现唯一校验实现代码[简单应用]
2011/11/29 PHP
php实现在站点里面添加邮件发送的功能
2020/04/28 PHP
php compact 通过变量创建数组
2016/11/15 PHP
Laravel中的chunk组块结果集处理与注意问题
2018/08/15 PHP
解决laravel5中auth用户登录其他页面获取不到登录信息的问题
2019/10/08 PHP
自适应高度框架 ----属个人收藏内容
2007/01/22 Javascript
WEB高性能开发之疯狂的HTML压缩
2010/06/19 Javascript
PHP 与 js的通信(via ajax,json)
2010/11/16 Javascript
克隆javascript对象的三个方法小结
2011/01/12 Javascript
javascript控制Div层透明属性由浅变深由深变浅逐渐显示
2013/11/12 Javascript
javascript计算当月剩余天数(天数计算器)示例代码
2014/01/09 Javascript
js通过iframe加载外部网页的实现代码
2015/04/05 Javascript
浅谈Javascript中Object与Function对象
2015/09/26 Javascript
AngularJs expression详解及简单示例
2016/09/01 Javascript
如何用JS/HTML将时间戳转换为“xx天前”的形式
2017/02/06 Javascript
基于jQuery选择器之表单对象属性筛选选择器的实例
2017/09/19 jQuery
laydate日历控件使用方法详解
2017/11/20 Javascript
简单两步使用node发送qq邮件的方法
2019/03/01 Javascript
JS求1到任意数之间的所有质数的方法详解
2019/05/20 Javascript
vue input标签通用指令校验的实现
2019/11/05 Javascript
详解element-ui动态限定的日期范围选择器代码片段
2020/07/03 Javascript
从局部变量和全局变量开始全面解析Python中变量的作用域
2016/06/16 Python
Python标准库shutil用法实例详解
2018/08/13 Python
Python如何在windows环境安装pip及rarfile
2020/06/15 Python
Python项目跨域问题解决方案
2020/06/22 Python
python实现移动木板小游戏
2020/10/09 Python
Django多数据库联用实现方法解析
2020/11/12 Python
TecoBuy澳大利亚:在线电子和小工具商店
2020/06/25 全球购物
医药专业应届毕业生求职信范文
2014/01/01 职场文书
会计专业毕业自荐书范文
2014/02/08 职场文书
初中班主任评语大全
2014/04/24 职场文书
宣传口号大全
2014/06/16 职场文书
关于做家务的心得体会
2016/01/23 职场文书
高中政治教师教学反思
2016/02/23 职场文书
Python图像处理之图像拼接
2021/04/28 Python
Python matplotlib可视化之绘制韦恩图
2022/02/24 Python