Python3学习(13)--排序函数sorted

我们今天来说一说排序函数sorted,前面我们讲过,我们可以使用sort()函数对一个list进行排序(但是我们对tuple就不行了,为什么呢,下面我们会复习到),这里的sort和sorted是不一样的,我们先来看一下,用help帮助函数输出的两个函数的解释:

一、list.sort

我们前面学函数的时候,学过默认参数,下面我们就用这种方式来演示一下排序的两种方式 reverse  True 或者 False:


(1)从小到大排序,默认就是reverse=False


(2)从大到小排序,不再给默认参数,我们让reverse =True


总结:sort()函数,是针对list本身的,是发生在list内部序列上的排序,因此我们发现输出L前后发生了变化,而list对象本来就是可变的,所以,不影响,但是tuple对象就不是了,所以,sort()这种排序不适合,不,是不针对tuple!


看完针对list的sort排序,我们再来看另一个排序函数sorted(本篇的主角):


二、sorted


以上,我们对这个sorted函数有了初步认识,但还没用,所以,我们也不知道这个函数和sort比起来,是不是更优越一些,来吧,我们就测试一下

简单的走起:‘


这个还是看不出来二者有什么区别,唯一区别就是sorted排序后返回了一个新的list,别急,我们继续走着:

我们知道sorted的第二个参数是一个关键字key,这个key指向一个函数并作用于可迭代的序列,这就是我们熟悉的高阶函数,不同于我们学过的map,reduce和filter,sorted总过有三个参数,这点需要注意区分;下面,我们重新对一个序列进行排序,排序的规则是按照序列中的整数元素进行绝对值大小比较并降序排列,为了区别sort,我们用tuple对象表示序列:



这个是比较数字的,如果我们比较的是str类型的呢?


其实比较字符串,就是比较字符串的首字母的ASCII码,这个码值是一个整数,整数是可以比较大小的,对于上面的L,我们来验证一下,为什么会这么排序,我们拿到四个单词的首字母'B','D','J','K',分别用函数ord()得到ASCII码值如下:

没毛病,升序排的话,最后一个确实是Kobe,我们再想一下,Kobe 和 kobe哪个在前呢?我们先得到ASCII码值:

由此可见,小写的kobe应该排在后面:


通过上面的几个例子,我们可以看出来,sorted相比sort来说:

a)、更加高级,更加抽象

b)、作用的对象,不再只是不可变的list了,而是可以迭代的对象,范围比较广了

c)、不会影响作用的可迭代的序列,序列一开始是什么,sorted结束后,依然是什么


以我的风格,sorted的讲解,不可能到这就结束了,我们还需要继续深挖,毕竟key指向的函数不可能都像abs那么简单,我们知道在SQL中,假设有这样一个评分表,记录着Kobe,James,Durant和Bob这四个人的综合评分,我们假设查出来的数据如下:

当然,现在,我们有两种排序法,一种是按姓名排,假设我们想要名字按升序来,我们可以用默认的来:

按成绩来的话,我们当然需要成绩高的排在前面,所以我们采用降序:


为什么讲着讲着Pyhon,我会扯到C++,java、C#或者其他语言呢,这不是无聊唆使,而是这样可以避免无聊,还有个好处就是,这样一对比,可以帮助我们更好的去理解Python某些函数的机制,更好的去使用它们;


扯回来,我们看下Python如何实现上述功能,首先,我们构造一个序列,序列中的元素是一个tuple对象(我们也可以采用字典dict,道理是一样 ):

 L = [('Kobe',95),('James',90),('Durant',98),('Bob',85)]


我们把L当成一个表结构(二维数组),每一个tuple对象是一行,tuple元组中的每个元素代表每一列,现在我们想要对L这个序列进行排序,条件是按照姓名升序排:

我们用两种方法实现,不用想,你应该能说出来是哪两种了吧:


A、一般简单函数实现key值的作用

B、lambda表达式实现key值的作用

这回我们不按Name来了,我们按成绩降序排列:



我去,小插曲啊,这个错告诉我们,不要过于自信在dos命令行下敲代码,这个错还告诉我们,你丫的,给你说了key不要拼写错了,谁叫你丫的连key都不写了!


好吧,我们正常点:


可以了吧,lambda表达式够可以的吧,是不是!?所以说呢,尽量熟练了以后,能用lambda表达式代替函数的就用它吧,就好比你明明有1张毛爷爷,你却非要给对方换10张10块的,按我说,你丫嫌零钱不够多是吧,可能其他人会想,太好了,一张换十张,起码钱包可以撑起来了。哈哈



结束语:

有时候,你带着目的性去做一件事情,实施的时候你发现,事情远没有最初想的那么简单,怎么办:

半途而废?  那就请你以后做事情的时候,不要带有目的性,平常心去做,平常心收尾;

坚持到底?  那就希望你以后做每一件事情都带有目的性,因为这样,你得到的会远比你付出的要多。