一、导读
本文着重讲解对 lambda 返回多个表达式的运用,如
lambda x: (x < 0, abs(x))
好文章 记得收藏+点赞+关注额 !!!---- Nick.Peng
二、lambda 应用案例
a_list = [-11, 14, 5, -15, -2, 11, 15, -3, 10, -5]
# 正数负数分开排序
sort_result = sorted(a_list, key=lambda x: (x < 0, abs(x)))
print(sort_result)
# 上面程序运行的结果:
[5, 10, 11, 14, 15, -2, -3, -5, -11, -15]
在案例中这一句lambda x: (x < 0, abs(x))
,其实就是 python 里面的 lambda 表达式。
三、lambda 表达式分解
lambda 表达式:
lambda x: (x < 0, abs(x))
相当于函数:
def fun(x):
return (x < 0, abs(x))
说明:
这个函数其实返回的是一个元组
四、sorted 高阶函数运用
-
作用:
sorted() 函数对所有可迭代的对象进行排序操作。
sort 与 sorted 区别:- sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。
- list 的 sort 方法返回的是
对已经存在的列表进行操作
,无返回值,而内建函数 sorted 方法返回的是一个新的 list
,而不是在原来的基础上进行的操作。
-
语法:
sorted(iterable, cmp=None, key=None, reverse=False)
-
参数说明:
- iterable: 可迭代对象。
- cmp: 比较的函数,这个具有两个参数,参数的值都是从可迭代对象中取出,此函数必须遵守的规则为,大于则返回1,小于则返回-1,等于则返回0。
- key: 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
- reverse: 排序规则,reverse = True 降序 , reverse = False 升序(默认)。
- 返回值: 返回重新排序的列表。
案例解析:
- 上面案例里,其实就是根据 lambda 表达式的返回值,再决定每个元素的大小,即元组和元组比较大小;
- 类似于 (True, 1) 和 (True, 2) 元组比较大小,默认小的排前面,大的排后面
那么问题来了,元组在 sorted 里是怎么比较大小呢?
,我们继续往下看。
五、元组如何比较大小?
元组比较大小,其实是比较元组中对应元素的大小,比如:x=(a1, a2, a3)
和y=(b1, b2, b3)
,方法如下:
- 先比较 a1 和 b1 的大小,如果
a1 > b1
, 那么x > y
; - 如果
a1 < b1
,那么x < y
; - 如果
a1 == a2
, 那么继续比较第二个元素大小,元组的大小由第二个元素大小决定, - 如果第二个元素也相等,那么比较第三个元素大小,依次类推。。。
六、本案例排序规则分析
排序规则:lambda x: (x < 0, abs(x))
规则分析:
- a. 所有的正数排前面,所有的负数排后面
- b. 如果两个数正负数类型相同,那么按两个数的绝对值大小比较,绝对值小的排前面,绝对值大的排后面
举例说明:
-
比如 5 和 -5 比较大小
其实就是比较(5<0, abs(5))
和(-5<0, abs(-5))
这两个元组的大小 -
(5<0, abs(5)) ==> (False, 5)
(-5<0, abs(-5)) ==> (True, 5)
-
所以相当于
(False, 5)
和(True, 5)
比较大小
结论:
(False, 5)
是小于 (True, 5)
的,所以排序的时候 5
排前面
,-5
排后面
。