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多进程同步Lock、Semaphore、Event实例
Nov 21 Python
python实现网站的模拟登录
Jan 04 Python
Django中的CBV和FBV示例介绍
Feb 25 Python
基于python OpenCV实现动态人脸检测
May 25 Python
python递归函数绘制分形树的方法
Jun 22 Python
python 文件转成16进制数组的实例
Jul 09 Python
DES加密解密算法之python实现版(图文并茂)
Dec 06 Python
OpenCV 模板匹配
Jul 10 Python
python之pymysql模块简单应用示例代码
Dec 16 Python
Python爬虫入门有哪些基础知识点
Jun 02 Python
使用PyCharm安装pytest及requests的问题
Jul 31 Python
Python 字典一个键对应多个值的方法
Sep 29 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介绍篇
2010/10/26 PHP
自己在做项目过程中学到的PHP知识收集
2012/08/20 PHP
destoon实现调用自增数字从1开始的方法
2014/08/21 PHP
PHP连接MSSQL2008/2005数据库(SQLSRV)配置实例
2014/10/22 PHP
PHP编写RESTful接口
2016/02/23 PHP
Codeigniter中集成smarty和adodb的方法
2016/03/04 PHP
PHP链表操作简单示例
2016/10/15 PHP
PHP单例模式与工厂模式详解
2017/08/29 PHP
javascript编程起步(第五课)
2007/01/10 Javascript
Firefox getBoxObjectFor getBoundingClientRect联系
2008/10/26 Javascript
JS Map 和 List 的简单实现代码
2013/07/08 Javascript
JQuery判断子iframe何时加载完成解决方案
2013/08/20 Javascript
jquery实现多行文字图片滚动效果示例代码
2014/10/10 Javascript
jQuery的ready方法详解
2014/11/27 Javascript
jQuery点缩略图弹出层显示大图片
2015/02/13 Javascript
原生JS实现九宫格抽奖效果
2017/04/01 Javascript
详谈vue+webpack解决css引用图片打包后找不到资源文件的问题
2018/03/06 Javascript
mpvue+vuex搭建小程序详细教程(完整步骤)
2018/09/30 Javascript
jQuery插件实现非常实用的tab栏切换功能【案例】
2019/02/18 jQuery
[09:22]2014DOTA2西雅图国际邀请赛 主赛事第二日TOPPLAY
2014/07/21 DOTA
[01:55]TI9显影之尘系列 - Evil Geniuses
2019/08/22 DOTA
Python获取文件ssdeep值的方法
2014/10/05 Python
Python3+PyInstall+Sciter解决报错缺少dll、html等文件问题
2019/07/15 Python
python 循环数据赋值实例
2019/12/02 Python
numpy.transpose()实现数组的转置例子
2019/12/02 Python
浅谈tensorflow中Dataset图片的批量读取及维度的操作详解
2020/01/20 Python
英国领先的维生素和补充剂品牌:Higher Nature
2019/08/26 全球购物
好的自荐信的要求
2013/10/30 职场文书
面试后感谢信怎么写
2014/02/01 职场文书
新闻专业毕业生求职信
2014/08/08 职场文书
办公室领导干部作风整顿个人整改措施
2014/09/17 职场文书
先进教师个人总结
2015/02/11 职场文书
驾驶员安全责任协议书
2016/03/22 职场文书
导游词之吉林花园山
2019/10/17 职场文书
Python docx库删除复制paragraph及行高设置图片插入示例
2022/07/23 Python
el-form每行显示两列底部按钮居中效果的实现
2022/08/05 HTML / CSS