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获取豆瓣电影简介代码分享
Jan 16 Python
Python编程中装饰器的使用示例解析
Jun 20 Python
Python切片索引用法示例
May 15 Python
Django框架使用富文本编辑器Uedit的方法分析
Jul 31 Python
简单了解Python matplotlib线的属性
Jun 29 Python
python实现控制COM口的示例
Jul 03 Python
Python 实例方法、类方法、静态方法的区别与作用
Aug 14 Python
python 协程中的迭代器,生成器原理及应用实例详解
Oct 28 Python
python shutil文件操作工具使用实例分析
Dec 25 Python
Python高并发解决方案实现过程详解
Jul 31 Python
Jupyter安装链接aconda实现过程图解
Nov 02 Python
Keras多线程机制与flask多线程冲突的解决方案
May 28 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中使用XML
2006/10/09 PHP
PHP扩展Memcache分布式部署方案
2015/12/06 PHP
PHP构造函数与析构函数用法示例
2016/09/28 PHP
javascript使用onclick事件改变选中行的颜色
2013/12/30 Javascript
jquery sortable的拖动方法示例详解
2014/01/16 Javascript
浅谈JavaScript的Polymer框架中的behaviors对象
2015/07/29 Javascript
Bootstrap模态框调用功能实现方法
2016/09/19 Javascript
Angular中使用ui router实现系统权限控制及开发遇到问题
2016/09/23 Javascript
js实现对table的增加行和删除行的操作方法
2016/10/13 Javascript
vue router-link传参以及参数的使用实例
2017/11/10 Javascript
在Vuex使用dispatch和commit来调用mutations的区别详解
2018/09/18 Javascript
nodejs读取本地中文json文件出现乱码解决方法
2018/10/10 NodeJs
layui实现数据分页功能(ajax异步)
2019/07/27 Javascript
javascript实现视频弹幕效果(两个版本)
2019/11/28 Javascript
TypeScript高级用法的知识点汇总
2019/12/17 Javascript
python模拟登录百度贴吧(百度贴吧登录)实例
2013/12/18 Python
Python内置数据类型详解
2014/08/18 Python
在Python的Django框架下使用django-tagging的教程
2015/05/30 Python
Python学习笔记整理3之输入输出、python eval函数
2015/12/14 Python
Python实现读取并保存文件的类
2017/05/11 Python
详解Python中for循环是如何工作的
2017/06/30 Python
sublime python3 输入换行不结束的方法
2018/04/19 Python
Django 连接sql server数据库的方法
2018/06/30 Python
selenium+python实现自动化登录的方法
2018/09/04 Python
Python中的元组介绍
2019/01/28 Python
服务器端jupyter notebook映射到本地浏览器的操作
2020/04/14 Python
Python3实现个位数字和十位数字对调, 其乘积不变
2020/05/03 Python
BIFFI美国站:意大利BIFFI BOUTIQUES豪华多品牌时装零售公司
2020/02/11 全球购物
华为c/c++笔试题
2016/01/25 面试题
新闻专业本科生的自我评价分享
2013/11/20 职场文书
年度献血先进个人事迹材料
2014/02/14 职场文书
团队经理竞聘书
2014/03/31 职场文书
新年寄语大全
2014/04/12 职场文书
优秀教师推荐材料
2014/12/16 职场文书
Java spring定时任务详解
2021/10/05 Java/Android
python人工智能human learn绘图可创建机器学习模型
2021/11/23 Python