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使用PyFetion来发送短信的例子
Apr 22 Python
Python序列之list和tuple常用方法以及注意事项
Jan 09 Python
Python3里的super()和__class__使用介绍
Apr 23 Python
python操作mongodb根据_id查询数据的实现方法
May 20 Python
Python的Django框架中settings文件的部署建议
May 30 Python
开始着手第一个Django项目
Jul 15 Python
Python实现修改文件内容的方法分析
Mar 25 Python
一文带你了解Python中的字符串是什么
Nov 20 Python
java判断三位数的实例讲解
Jun 10 Python
python传到前端的数据,双引号被转义的问题
Apr 03 Python
Pycharm无法打开双击没反应的问题及解决方案
Aug 17 Python
使用pandas读取表格数据并进行单行数据拼接的详细教程
Mar 03 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
老机欣赏|中国60年代精品收音机
2021/03/02 无线电
用PHP和ACCESS写聊天室(九)
2006/10/09 PHP
PHP Memcached应用实现代码
2010/02/08 PHP
PHP截断标题且兼容utf8和gb2312编码
2013/09/22 PHP
php版微信数据统计接口用法示例
2016/10/12 PHP
JS(jQuery)实现聊天接收到消息语言自动提醒功能详解【提示“您有新的消息请注意查收”】
2019/04/16 PHP
解决laravel资源加载路径设置的问题
2019/10/14 PHP
Laravel 手动开关 Eloquent 修改器的操作方法
2019/12/30 PHP
QQ登录简单实现代码
2021/03/09 Javascript
JS关键字球状旋转效果的实例代码
2013/11/29 Javascript
jquery.validate提示错误信息位置方法
2016/01/22 Javascript
JS获取当前页面名称的简单实例
2016/08/19 Javascript
ES6字符串模板,剩余参数,默认参数功能与用法示例
2017/04/06 Javascript
基于JavaScript实现微信抢红包功能
2017/07/20 Javascript
微信小程序-form表单提交代码实例
2019/04/29 Javascript
layui实现tab的添加拒绝重复的方法
2019/09/04 Javascript
微信小程序自定义联系人弹窗
2020/05/26 Javascript
[03:23]我的刀塔你不可能这么可爱 第一期金萌萌的故事
2014/06/20 DOTA
Python创建文件和追加文件内容实例
2014/10/21 Python
Python随手笔记之标准类型内建函数
2015/12/02 Python
Python安装第三方库及常见问题处理方法汇总
2016/09/13 Python
APIStar:一个专为Python3设计的API框架
2018/09/26 Python
简单了解Python matplotlib线的属性
2019/06/29 Python
python3在同一行内输入n个数并用列表保存的例子
2019/07/20 Python
在tensorflow中实现屏蔽输出的log信息
2020/02/04 Python
Python ADF 单位根检验 如何查看结果的实现
2020/06/03 Python
如何将Pycharm中调整字体大小的方式设置为&quot;ctrl+鼠标滚轮上下滑&quot;
2020/11/17 Python
Web页面中八种创建多列等高(等高列布局)的实现技术
2012/12/24 HTML / CSS
Lululemon加拿大官网:加拿大知名体育服装零售商
2019/04/12 全球购物
高中生物教学反思
2014/02/05 职场文书
数控技术学生的自我评价
2014/02/15 职场文书
反四风个人对照检查材料思想汇报
2014/09/25 职场文书
2014收银员工作总结范文
2014/12/16 职场文书
售后前台接待岗位职责
2015/04/03 职场文书
课题研究阶段性总结
2015/08/13 职场文书
Python实现Excel文件的合并(以新冠疫情数据为例)
2022/03/20 Python