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+django实现文件上传
Jan 17 Python
python定向爬取淘宝商品价格
Feb 27 Python
Python+Django搭建自己的blog网站
Mar 13 Python
Django学习笔记之ORM基础教程
Mar 27 Python
Python做智能家居温湿度报警系统
Sep 25 Python
Python3 关于pycharm自动导入包快捷设置的方法
Jan 16 Python
Django多进程滚动日志问题解决方案
Dec 17 Python
浅谈pytorch、cuda、python的版本对齐问题
Jan 15 Python
python默认参数调用方法解析
Feb 09 Python
Python常用GUI框架原理解析汇总
Dec 07 Python
python字典按照value排序方法
Dec 28 Python
用python查找统一局域网下ip对应的mac地址
Jan 13 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中有关合并某一字段键值相同的数组合并的改进
2015/03/10 PHP
php实现短信发送代码
2015/07/05 PHP
解决php 处理 form 表单提交多个 name 属性值相同的 input 标签问题
2017/05/11 PHP
js 实现无干扰阴影效果 简单好用(附文件下载)
2009/12/27 Javascript
jquery必须知道的一些常用特效方法及使用示例(整理)
2013/06/24 Javascript
深入理解JavaScript中的对象复制(Object Clone)
2016/05/18 Javascript
jQuery插件passwordStrength密码强度指标详解
2016/06/24 Javascript
jQuery实现鼠标跟随效果
2017/02/20 Javascript
Node.js中Koa2在控制台输出请求日志的方法示例
2019/05/02 Javascript
Vue 页面权限控制和登陆验证功能的实例代码
2019/06/20 Javascript
使用Vue实现调用接口加载页面初始数据
2019/10/28 Javascript
Python简单日志处理类分享
2015/02/14 Python
Python标准库之collections包的使用教程
2017/04/27 Python
使用Python写一个贪吃蛇游戏实例代码
2017/08/21 Python
Zookeeper接口kazoo实例解析
2018/01/22 Python
python+selenium打印当前页面的titl和url方法
2018/06/22 Python
python批量获取html内body内容的实例
2019/01/02 Python
python matplotlib画图库学习绘制常用的图
2019/03/19 Python
python实现AES加密和解密
2019/03/27 Python
python 将字符串完成特定的向右移动方法
2019/06/11 Python
PyTorch中Tensor的维度变换实现
2019/08/18 Python
python 在右键菜单中加入复制目标文件的有效存放路径(单斜杠或者双反斜杠)
2020/04/08 Python
利于python脚本编写可视化nmap和masscan的方法
2020/12/29 Python
木马的传播途径主要有哪些
2016/04/08 面试题
安全检查管理制度
2014/02/02 职场文书
创建学习型党组织实施方案
2014/03/29 职场文书
《故乡》教学反思
2014/04/10 职场文书
捐款倡议书格式范文
2014/05/14 职场文书
大一工商管理职业生涯规划:有梦最美,行动相随
2014/09/18 职场文书
学校实习推荐信
2015/03/27 职场文书
公司员工体检通知
2015/04/21 职场文书
2015年关爱留守儿童工作总结
2015/05/22 职场文书
2016婚礼主持词开场白
2015/11/24 职场文书
React如何创建组件
2021/06/27 Javascript
Python matplotlib绘制条形统计图 处理多个实验多组观测值
2022/04/21 Python
提高系统的吞吐量解决数据库重复写入问题
2022/04/23 MySQL