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 18 Python
详解python之配置日志的几种方式
May 22 Python
Python-OpenCV基本操作方法详解
Apr 02 Python
基于DataFrame筛选数据与loc的用法详解
May 18 Python
Python反爬虫技术之防止IP地址被封杀的讲解
Jan 09 Python
python算法题 链表反转详解
Jul 02 Python
使用 Python 读取电子表格中的数据实例详解
Apr 17 Python
python多线程实现同时执行两个while循环的操作
May 02 Python
python中JWT用户认证的实现
May 18 Python
openCV提取图像中的矩形区域
Jul 21 Python
python实现sm2和sm4国密(国家商用密码)算法的示例
Sep 26 Python
python实现一个简单RPC框架的示例
Oct 28 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
德生PL990,目前市面上唯一一款便携式插卡蓝牙全波段高性能收音机
2021/03/02 无线电
javascript 小型动画组件与实现代码
2010/06/02 PHP
php定时删除文件夹下文件(清理缓存文件)
2013/01/23 PHP
谈谈关于php的优点与缺点
2013/04/11 PHP
推荐一款MAC OS X 下php集成开发环境mamp
2014/11/08 PHP
详解 PHP加密解密字符串函数附源码下载
2015/12/18 PHP
使用PHP+Redis实现延迟任务,实现自动取消订单功能
2019/11/21 PHP
jquery select选中的一个小问题
2009/10/11 Javascript
js 加载并解析XML字符串的代码
2009/12/13 Javascript
Javascript和Ajax中文乱码吐血版解决方案
2009/12/21 Javascript
一个简单的js树形菜单
2011/12/09 Javascript
动态的绑定事件addEventListener方法的使用
2014/01/24 Javascript
详细解密jsonp跨域请求
2015/04/15 Javascript
jQuery实现类似老虎机滚动抽奖效果
2015/08/06 Javascript
javascript实现网站加入收藏功能
2015/12/16 Javascript
jQuery弹出div层过2秒自动消失
2016/11/29 Javascript
weex里Vuex state使用storage持久化详解
2017/09/09 Javascript
Vue调试神器vue-devtools安装方法
2017/12/12 Javascript
jQuery获取所有父级元素及同级元素及子元素的方法(推荐)
2018/01/21 jQuery
angular4笔记系列之内置指令小结
2018/11/09 Javascript
使用vue完成微信公众号网页小记(推荐)
2019/04/28 Javascript
vue App.vue中的公共组件改变值触发其他组件或.vue页面监听
2019/05/31 Javascript
Vue+Typescript中在Vue上挂载axios使用时报错问题
2019/08/07 Javascript
JavaScript实现滑块验证解锁
2021/01/07 Javascript
Python使用matplotlib模块绘制图像并设置标题与坐标轴等信息示例
2018/05/04 Python
Python如何绘制日历图和热力图
2020/08/07 Python
澳大利亚领先的在线机械五金、园艺和存储专家:Edisons
2018/03/24 全球购物
美国社交购物市场:MassGenie
2019/02/18 全球购物
大学生职业生涯规划书范文
2014/01/14 职场文书
霸王洗发水广告词
2014/03/14 职场文书
致共产党员倡议书
2014/04/16 职场文书
小学三年级班主任工作经验交流材料
2015/11/02 职场文书
python Tkinter的简单入门教程
2021/04/11 Python
Pygame Draw绘图函数的具体使用
2021/11/17 Python
JMeter对MySQL数据库进行压力测试的实现步骤
2022/01/22 MySQL
MySQL池化框架学习接池自定义
2022/07/23 MySQL