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 字符串中的字符倒转
Sep 06 Python
用python登录Dr.com思路以及代码分享
Jun 25 Python
Python socket.error: [Errno 98] Address already in use的原因和解决方法
Aug 25 Python
python 判断是否为正小数和正整数的实例
Jul 23 Python
Python绘制3d螺旋曲线图实例代码
Dec 20 Python
转换科学计数法的数值字符串为decimal类型的方法
Jul 16 Python
18个Python脚本可加速你的编码速度(提示和技巧)
Oct 17 Python
Python 切分数组实例解析
Nov 07 Python
使用SQLAlchemy操作数据库表过程解析
Jun 10 Python
django haystack实现全文检索的示例代码
Jun 24 Python
利用Python多线程实现图片下载器
Mar 25 Python
python playwrigh框架入门安装使用
Jul 23 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判断上传的Excel文件中是否有图片及PHPExcel库认识
2013/01/11 PHP
页面利用渐进式JPEG来提升用户体验度
2014/12/01 PHP
php实现模拟登陆方正教务系统抓取课表
2015/05/19 PHP
PHP里的单例类写法实例
2015/06/25 PHP
Yii2中DropDownList简单用法示例
2016/07/18 PHP
javascript 图片上一张下一张链接效果代码
2010/03/12 Javascript
jquery解决图片路径不存在执行替换路径
2013/02/06 Javascript
关于javascript event flow 的一个bug详解
2013/09/17 Javascript
原生JS可拖动弹窗效果实例代码
2013/11/09 Javascript
PHP+mysql+Highcharts生成饼状图
2015/05/04 Javascript
javascript实现类似于新浪微博搜索框弹出效果的方法
2015/07/27 Javascript
基于JavaScript实现Json数据根据某个字段进行排序
2015/11/24 Javascript
vue.js2.0点击获取自己的属性和jquery方法
2018/02/23 jQuery
一种angular的方法级的缓存注解(装饰器)
2018/03/13 Javascript
Vue.js实现表格渲染的方法
2018/09/07 Javascript
jQuery 添加元素和删除元素的方法
2020/07/15 jQuery
解决vue项目运行提示Warnings while compiling.警告的问题
2020/09/18 Javascript
[02:48]DOTA2英雄基础教程 拉席克
2013/12/12 DOTA
介绍Python中几个常用的类方法
2015/04/08 Python
Python中encode()方法的使用简介
2015/05/18 Python
Python中List.index()方法的使用教程
2015/05/20 Python
python3实现随机数
2018/06/25 Python
python openCV获取人脸部分并存储功能
2019/08/28 Python
使用pandas实现连续数据的离散化处理方式(分箱操作)
2019/11/22 Python
python实现图像随机裁剪的示例代码
2020/12/10 Python
麦当劳印度网上订餐:McDelivery
2020/03/16 全球购物
材料加工硕士生求职信
2013/10/10 职场文书
推荐信模板
2014/05/09 职场文书
优秀教师单行材料
2014/12/16 职场文书
学习雷锋精神倡议书
2015/04/27 职场文书
大学军训心得体会800字
2016/01/11 职场文书
2016年学校党支部创先争优活动总结
2016/04/05 职场文书
祝福语集锦:送给闺蜜的生日祝福语
2019/10/08 职场文书
MongoDB数据库部署环境准备及使用介绍
2022/03/21 MongoDB
win10清理dns缓存
2022/04/19 数码科技
通过feDisplacementMap和feImage实现水波特效
2022/04/24 HTML / CSS