开发者学堂课程【Python 入门 2020年版:sort 方法的使用 】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/639/detail/10341
sort 方法的使用
内容介绍:
一、 用 sort 方法进行排序
二、 内置函数 sorted
三、 对元组进行排序
四、 对含有字典的数据进行排序
一、用 sort 方法进行排序
1、有几个内置函数和内置类,用到了匿名函数。列表的 sort 方法,会直接对列表进行排序。
2、一段数字482176,sort可以直接进行排序,排完了之后,这个数据就已经变成有序的124678。
nums =[4, 8, 2,1,7,6]
nums.sort()
print(nums)
二、内置函数 sorted
1、把 nums 放进 sorted() 内
sorted(nums)
print(nums)
现在这个情况下运行后是没有排序的。sorted 是内置函数,不会改变原有的数据,而是生成一个新的结果,这个新的结果 x 才是有序的,sorted 是一个内置函数,内置函数的作用不是把原来的数据进行排序。
三、对元组进行排序
1、元组是不可变的,但是如果想对元组里面是数据进行排列,可以用到 sorted 内置函数。例如一个元组 ints,把 ints 放进 sortd 内
ints=( 5,9,2,1,3,8,7,4)
x=sorted(ints)
运行一下会看到,元组被排成有序的 12345789,元组是不可变的,不可能直接改变,而是生成一个新的结果这个结果是有序的,也就是直接生成了一个新的有序的列表。
四、对含有字典的数据进行排序
1、有一个大的列表,张三年龄是 18,分数 98,身高是 1m8,李四的年龄 21,分数是 97,他的身高是 1m85,杰克年龄是 22,分数是 100分,他的身高是1m75,tony 是 23 岁他的分数是 90 分,身高是 1m76,henry 20岁,分数 95 分身高是 1m72
students=[
{'name': 'zhangsan', 'age':18, 'score': 98, 'height':180},
{'name': 'lisi', age': 21, ‘score': 97, 'height':185},
{'name': 'jack', 'age': 22, 'score':100, 'height': 175},
{'name': 'tony', 'age':23, 'score': 90, 'height': 176},
{'name': 'henry', 'age': 20, ‘score': 95, 'height': 172}]
如果直接用 sort 对这个数据排序
students.sort()
print(students)
运行后是直接报错的,这是因为不管用哪一种排序算法,都要有一个比较的过程。
如果全是数字,可以直接用比较运算,但是字典与字典,比如 zhangsan 和 jack,是没有可比性的,不支持比较运算,
所以这里的的报错原因写的是不支持字典与字典之间的比较。
2、传递参数 key 指定比较规则。如果不是数字,也不是字符串,而是这种字典的话是不能使用比较运算,因为缺少比较规则。
大表中有很多数据,每一个都有 name,age,score,height ,到底要按什么排需要表达清楚,sort 里有一个参数叫 self,这里先不管 self,讲面向规则的时候会提到,不要把 self 当作参数,没有这个参数,除了 self 还有两个分别是 key,reverse, reverse 之前讲过是升序降序的,key 没有传过,这里需要传递参数 key比较规则,key 参数类型是函数,需要一个函数就给它定义一个函数。
def foo():
pass
students.sort(key=foo)
print(students)
再来运行一下,又报错了,但是这一次的报错跟上一次的报错不一样,上一次报错说的是字典和字典之间不能使用比较运算符,这一次因为 foo 这个函数需要 0 个位置参数,也就是在定义的时候不需要参数,但是在调用的时候传递了一个参数。
3、是在 sort 内部调用的时候传入的参数,就相当于只是把这个函数给到了这个参数,只是给它作为一个参数传进去了,调的话是在 calc 内部调的,它内部写了一个 a 和 b,它要两个,但是在定义的时候的没给就会有问题。
def calc(a, b, fn):
c=fn(a,b)
return c
x3 = calc(5, 7,lambdax,y:x+y)
x4 = calc(19, 3,lambda x, y:x- y)
x5 = calc(2, 7, lambda ×, y: ×*y)
x6 = calc(12, 3, lambda ×,y:×/ y)
所以是在 sort 内部实现的时候,调用了 foo 方法,并且传入了一个参数。
sort 函数这个方法不是自己写的,而是系统自带的,既然改不了它调的地方,加一个参数就行了,随便写一个参数ele
def foo(ele):
pass
students.sort(key=foo)
print(students)
运行又会报错但是报错的原因不一样,是小于号在空类型之间是不支持的,先不管这个,先看调的时候传的参数到底是什么
def foo(ele):
print("ele ={ }".format(ele))
运行的结果
上面说到在 sort 内部实现的时候,调用了 foo 方法,并且传入了一个参数,这个参数就是列表里的元素。
要排序,至少得把这些元素遍历一遍,所以它每次就把这个数据拿出来传给你,这里直接写返回值 return ele 就行
def foo(ele):
print("ele ={ }".format(ele))
return ele
ele 是一个字典,有好几个字段 age,score,height,需要通过返回值告诉 sort 方法按照元素的哪个属性进行排序,通过返回值取出某一个元素,比如取出所有人的年龄,就是对年龄来进行一个排序,运行后年龄就有序了。
def foo(ele):
print("ele = ()".format(ele))
return ele['age']
如果想按照身高来排,直接通过 height 来进行排序,运行后身高就是有序的,还可以把写法简化一下,用 lambda 表达式来做,想用哪个元素排就用哪个,它是比较高级的一个使用
students.sort(key=lambda ele: ele['height'])|print(students)
4、总结一下,要排序根据以前的经验知道肯定要做比较运算,内置函数比较运算就是通过 key,然后指定一个函数,通过函数的返回值告诉比较的规则。