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实现在目录中查找指定文件的方法
Nov 11 Python
利用一个简单的例子窥探CPython内核的运行机制
Mar 30 Python
解决Python中字符串和数字拼接报错的方法
Oct 23 Python
基于Django用户认证系统详解
Feb 21 Python
django1.11.1 models 数据库同步方法
May 30 Python
Django开发的简易留言板案例详解
Dec 04 Python
pycharm 将python文件打包为exe格式的方法
Jan 16 Python
python-django中的APPEND_SLASH实现方法
Jun 21 Python
python+numpy按行求一个二维数组的最大值方法
Jul 09 Python
安装python及pycharm的教程图解
Oct 10 Python
Matplotlib使用字符串代替变量绘制散点图的方法
Feb 17 Python
Python基于paramunittest模块实现excl参数化
Apr 26 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与javascript的两种交互方式
2006/10/09 PHP
php二分查找二种实现示例
2014/03/12 PHP
JS 页面自动加载函数(兼容多浏览器)
2009/05/18 Javascript
对象无length属性时IE6/IE7中无法将其转换成伪数组(ArrayLike)
2011/07/31 Javascript
js获取元素到文档区域document的(横向、纵向)坐标的两种方法
2013/05/17 Javascript
jquery实现动态菜单的实例代码
2013/11/28 Javascript
Javascript中的高阶函数介绍
2015/03/15 Javascript
js实现漂浮回顶部按钮实例
2015/05/06 Javascript
跟我学习javascript的arguments对象
2015/11/16 Javascript
javascript html5移动端轻松实现文件上传
2020/03/27 Javascript
JavaScript中数组去除重复的三种方法
2016/04/22 Javascript
js 求时间差的实现代码
2016/04/26 Javascript
详解微信小程序 页面跳转 传递参数
2016/12/08 Javascript
详解angular2采用自定义指令(Directive)方式加载jquery插件
2017/02/09 Javascript
vue学习笔记之v-if和v-show的区别
2017/09/20 Javascript
jQuery基于Ajax实现读取XML数据功能示例
2018/05/31 jQuery
微信小程序实现随机验证码功能
2018/12/20 Javascript
js实现图片局部放大效果详解
2019/03/18 Javascript
微信小程序BindTap快速连续点击目标页面跳转多次问题处理
2019/04/08 Javascript
Vue3.0结合bootstrap创建多页面应用
2019/05/28 Javascript
简单了解小程序+node梳理登陆流程
2019/06/24 Javascript
Python中的exec、eval使用实例
2014/09/23 Python
python中68个内置函数的总结与介绍
2020/02/24 Python
Python+Django+MySQL实现基于Web版的增删改查的示例代码
2020/05/13 Python
PySide2出现“ImportError: DLL load failed: 找不到指定的模块”的问题及解决方法
2020/06/10 Python
农药学硕士毕业生自荐信
2013/09/25 职场文书
年会搞笑主持词
2014/03/27 职场文书
遵纪守法演讲稿
2014/05/23 职场文书
工商管理专业毕业生求职信
2014/05/26 职场文书
小学生运动会通讯稿
2014/09/23 职场文书
中学生运动会新闻稿
2014/09/24 职场文书
优秀教育工作者事迹材料
2014/12/24 职场文书
个人委托函范文
2015/01/29 职场文书
2015年统计员个人工作总结
2015/07/23 职场文书
感恩父母主题班会
2015/08/12 职场文书
Win11电源已接通但未充电怎么办?Win11电源已接通未充电的解决方法
2022/04/05 数码科技