python lambda表达式 与 sort函数中的key 小记

lambda表达式

lambda 表达式常用来声明匿名函数,也就是没有函数名字的、临时使用的小函数,常用在临时需要一个类似于函数的功能但又不想定义函数的场合。例如,内置函数sorted()和列表方法sort()的 key参数,内置函数map()和filter()的第一个参数等。当然,也可以使用lambda表达式定义具名函数。
lambda表达式只可以包含一个表达式,不允许包含复杂语句和结构,但在表达式中可以调用其他函数,该表达式的计算结果相当于函数的返回值。下面的代码演示了不同情况下 lambda表达式的应用。

简言之:lambda表达式就是函数的迷你版,如果定义的函数比较简单可以使用lambda代替。

>>> def func(a,b,c):
	return a+b+c
>>> f = lambda a,b,c:a+b+c  # 与func函数等价
>>> f(1,2,3) # 输出6
>>> s = lambda a,b=5,c=1:a+b+c  # 支持默认参数
>>> s(8)  # 输出14
>>> s = "abcde"
>>> tuple(map(lambda x:x.upper(),s))  # lambda 也可以作为函数参数
('A', 'B', 'C', 'D', 'E')

咳咳,我说一下map函数,真的太顶了。它有两个参数嘛,第二个参数是一个可迭代对象,列表,元组,字符串,集合,字典那些,第一个参数一般就是一个功能函数来的,map函数大概就是,将迭代对象里面的每一个元素都传那个功能函数进行处理,以上面例子为例,将字符串s里面的每一个小写元素通过lambda表达式函数转换为大写,存到map对象里面,如果要看结果的话要用list,tuple这些数据类型将其强制转换出来显示,不然看不到。

sort函数

最后就是经典的与sort函数搭配了。假设有一个二维列表,我们以第二维元素值的大小对列表进行排序。那么他的写法应该是这样的。

>>> a = [[1,4],[2,3],[5,1]]
>>> a
[[1, 4], [2, 3], [5, 1]]
>>> sorted(a,key=lambda x:x[1])   # 用sorted是不想修改a
[[5, 1], [2, 3], [1, 4]]     # 可以看到生成了按嵌套列表中第二个元素排序的列表

或许有些读者跟我刚才一样,知道这样写,但不知道怎么来的。于是我特地找了一些资料,大概的用法就是如果指定key的话就会先遍历一遍可迭代对象,得到每个元素的key值,然后根据这个key值进行排序。相当于 for i in a,然后指定对i的某种操作,当然,要写成函数的形式才行。如果写成一般函数的话是这种形式。

>>> a = [[1,4],[2,3],[5,1]]
>>> def func(nums):  # 这里的nums相当于是a中的每个元素 也就是[1,4],[2,3],[5,1]
	return nums[1]
# 注意注意!这里要格外注意,这里的key中func没有括号没有参数只有名字,相当于就是将a中的每个元素[1,4],[2,3],[5,1]分别去调用func函数得到一个key值,最后根据这个k值进行排序。
>>> sorted(a,key=func)  
[[5, 1], [2, 3], [1, 4]]

当我们大概知道了这个sort如何排序之后,其他多骚的写法都能写得出来,现在我们就试试。

>>> def func(string):   # 定义一个函数
		res = len(set(string))    #  首先计算这个单词有多少个字母 如“aaabb”算两个字母
		for i in string:
			if i.isupper():  # 如果是大写
				res *=1.15 * ord(i)  # ord表示 i 在 ASCII 对应的值
			else:
				res*=1.05 * ord(i)
		return res 
>>> a = "haHASHSADHn IamaHandsomeBoy  SLSKJlkjSLSjGHUh  iljEILNGLKD".split()
>>> sorted(a,key=func)  # 记住不要括号
['haHASHSADHn', 'iljEILNGLKD', 'IamaHandsomeBoy', 'SLSKJlkjSLSjGHUh']

骚写法写得出来,简单的写法就迎刃而解了。当然,使用lambda表达式前提是你对排序的定义足够简单,就是按哪个哪个排序的。复杂一点的话就要像上面一样自定义函数了。下面看一下使用lambda对字典以值(值噢,而不是键)进行排序。

>>> a
{
    
    1: 5, 2: 3, 7: 6, 5: 2}
>>> sorted(a)  # 如果直接写的话只会对键排序,没有达到我们想要的效果。
[1, 2, 5, 7]
>>> a.sort()   # 如果直接使用sort会报错,因为字典没有这个函数
Traceback (most recent call last): 
  File "<pyshell#47>", line 1, in <module>
    a.sort()
AttributeError: 'dict' object has no attribute 'sort'
>>> sorted(a.items(),key=lambda x:x[1])  # 因为键值我们都要,所以要使用a.items(),然后以每个元素的第二个值作为key值进行排序,得到下面的结果
[(5, 2), (2, 3), (1, 5), (7, 6)]    # 我们想要的应该是排序后的字典,而这个还不是,但是有点像,我们可以直接使用dict函数强制转换成字典。
>>> dict(sorted(a.items(),key=lambda x:x[1]))
{
    
    5: 2, 2: 3, 1: 5, 7: 6}   # 搞定

猜你喜欢

转载自blog.csdn.net/lishuaigell/article/details/124158763
今日推荐