目录
一,总览
二,示例
示例1 lambda x:x[0]:
示例2 lambda x:(abs(x),x):
示例3 filter(lambda x:(x%2 == 1),L) map(lambda x:x**2,L):
示例4 def与lambda
三,回顾
本文通过罗列范例,包括题目要求,输入,代码,解释,输出来解释lambda,代码中也会有具体注释:
首先文字介绍下lambda:
1,lambda一般用来定义简单的函数,而def可以定义复杂的函数
2,lambda函数的函数体只是一个表达式
3,lambda函数是一种匿名函数
4,lambda函数可以接受任意数量的参数,但只能包含一个表达式
5,lambda函数用于定义简单的、能够在一行内表示的函数
(熟练的直接看代码和输出,新手多看看注释和分析)
要求:
已知两个二维列表
第一个列表的元素是元组,按第 2 个元素的值从小到大排序输出,输出前 m 项
第二个列表的元素是列表,按其每个元素第 1 个元素的值从小到大排序,输出前 n 项
再按第二个列表每个元素第 3 个元素的值从小到大排序,输出前 n 项
输入:
2
3
代码:
#已知两个二维列表
#第一个列表的元素是元组,按第 2 个元素的值从小到大排序输出,输出前 m 项
#第二个列表的元素是列表,按其每个元素第 1 个元素的值从小到大排序,输出前 n 项
#再按第二个列表每个元素第 3 个元素的值从小到大排序,输出前 n 项
list1 = [('dungeon',7),('winterfell',4),('bran',9),('meelo',6)]
list2 = [[ 'Angle', '0121701100106',99], [ 'Jack', '0121701100107',86], [ 'Tom', '0121701100109',65], [ 'Smith', '0121701100111', 100], ['Bob', '0121701100115',77], ['Lily', '0121701100117', 59]]
m = int(input())
n = int(input())
#list1.sort(key = lambda x:x[1],reverse = False) 和下面一行等价
List1 = sorted(list1,key = lambda x:x[1],reverse = False)#按第2个元素的值正序排列
List2 = sorted(list2,key = lambda x:x[0],reverse = False)#按第1个元素的值正序排列
List3 = sorted(list2,key = lambda x:x[2],reverse = False)#按第3个元素的值正序排列
#print(list1[:m]) 和下面一行等价
print(List1[:m])
print(List2[:n])
print(List3[:n])
输出:
[('winterfell', 4), ('meelo', 6)]
[['Angle', '0121701100106', 99], ['Bob', '0121701100115', 77], ['Jack', '0121701100107', 86]]
[['Lily', '0121701100117', 59], ['Tom', '0121701100109', 65], ['Bob', '0121701100115', 77]]
解释:
list2 = sorted(list1, key = lambda 参数:表达式, reverse = False)
或者list1.sort(key = lambda 参数:表达式, reverse = True)
其中.sort()对列表排序后返回None,不可直接打印list1.sort(),而sorted()可以直接打印
本题lambda中参数为x,表达式为x[1], x[0], x[2],表达式起到了函数的作用
再次强调!!!sorted()不改变原列表,所以必须用变量保存排序后的列表;
而.sort()直接改变原列表,且返回None,所以禁止用变量保存!!!
(
2022/12/7补充:刚又做了下示例1,又犯了这里的错误,
List1 = list1.sort(key = lambda x:x[1]), print(List1)
结果报错:
TypeError: 'NoneType' object is not subscriptable
所以需要对一个原列表进行多次修改,最好用sorted(),这样不会改变它
)
而.sort()直接改变原列表,且返回值为None,即没有返回值
补充:.sort()可以有key参数,也可以有reverse参数,也可以没有参数
但只要带参数,前面的key和reverse不能少
sorted()必须要有序列,即sorted(List),剩下两参数同.sorted
lambda简单运用
看代码:
a = lambda x:x+1
b = lambda x:(abs(x))
c = lambda x:x%2
d = lambda x,y:x*y
print(a(6),b(-9),c(65),d(2,6),end=' ')
print()
list1 = [-5,26,3,7,5,12,9,-3.3,666,3.3]
list1.sort(key = lambda x:(abs(x),x),reverse = False)
#上面先按绝对值(第一关键词)从小到大排列,绝对值相同则先输出负数(第二关键词,即本身更小的)
print(list1)
输出:
7 9 1 12
[3, -3.3, 3.3, -5, 5, 7, 9, 12, 26, 666]
lambda结合map(),filter()
代码1:map()结合lambda的简单例子
list2 = [38,129,9,2,6,0,34,17,68,18,22,96,69]
list3 = list(map((lambda x:x%2),list2))#map(函数,序列), 可使用list()转换为列表
list4 = list(map((lambda x:x**2),list2))
print(list3)
print(list4)
输出:
[0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]
[1444, 16641, 81, 4, 36, 0, 1156, 289, 4624, 324, 484, 9216, 4761]
代码2:map(),filter()关于lambda对比
#lambda与map(),filter()结合的区别分析
#filter()是过滤器,map()是映射
#情况1:没有逻辑判断
#filter(函数,序列),可使用list()转列表
L = [5,10,100,1001,27,31,42,39,66,3,6,7]
L1 = list(filter(lambda x:x**2,L))#filter()返还列表元素
L2 = list(map(lambda x:x**2,L))#map()返还列表元素计算结果
print(L1)
print(L2)
#情况2:有逻辑判断
L3 = filter(lambda x:(x%2 == 1),L)#filter()筛选符合lambda表达式的列表元素
L4 = map(lambda x:(x%2 == 1),L)#map()对列表元素是否满足lambda进行判断,输出False,True
print(list(L3))
print(list(L4))
输出:
[5, 10, 100, 1001, 27, 31, 42, 39, 66, 3, 6, 7]
[25, 100, 10000, 1002001, 729, 961, 1764, 1521, 4356, 9, 36, 49]
[5, 1001, 27, 31, 39, 3, 7]
[True, False, False, True, True, True, False, True, False, True, False, True]
总结:map(lambda())返回计算结果,filter(lambda()) 筛选列表元素
lambda与函数定义的区别
代码:
def a(x):
return x+1
print(a(1))
b = lambda x:x+1
print(b(1))
输出:
2
2
lambda函数与定义函数等价,但是lambda更简洁,而函数定义更直观,便于理解
起因:
10天后当我复习这篇博客时,想用map实现示例1的结果,“按列表中第几个元素的值排列”,结果不行
看代码:
list1 = [('dungeon',7),('winterfell',4),('bran',9),('meelo',6)]
list2 = [[ 'Angle', '0121701100106',99], [ 'Jack', '0121701100107',86], [ 'Tom', '0121701100109',65], [ 'Smith', '0121701100111', 100], ['Bob', '0121701100115',77], ['Lily', '0121701100117', 59]]
List1 = list(map(lambda x:x[1], list1))
List2 = list(map(lambda x:x[0], list2))
List3 = list(map(lambda x:x[2], list2))
print(List1)
print(List2)
print(List3)
输出:
[7, 4, 9, 6]
['Angle', 'Jack', 'Tom', 'Smith', 'Bob', 'Lily']
[99, 86, 65, 100, 77, 59]
解释:
按照对map的理解,map(函数,序列),返回结算结果,map(lambda x:x[1], list1)的意思是,将x[1] * 1作为结果返回,结果就是按原来顺序返回第二个元素。
易错点:lambda x:表达式,map(函数,list),filter(函数,list),sorted(list, key = , reverse = ),list.sort(key = , reverse = ),注意list前后位置的区别