对Python中lambda方法的理解——以词典(dic)值(value)排序为例

每次在任务中需要以词典的值排序,我都会百度一下解决,巧的是每次解决之后,我都会说下次一定不百度。嗯,“真香”。所以趁着这次在家,抽出时间好好理解一下其中看起来最复杂的lambda部分,到底是干什么的。

1. 简述lambda

     首先,lambda可以理解为函数式的另一种写法,这种写法没有函数名、不能写判断、循环和输出等,且定义之后不能共享使用。关于lambda和def的区别可以看文章1,总结得很好。

     其次,lambda的语法为: lambda 变量名: 对变量执行的语句(返回处理后的结果)

     在文章2中给出了lambda和def函数式的转化形式:

# lambda函数式
lambda x: x**2

# 效果等同于下面的def函数式
def fun(x):
    return x**2

     个人感觉lambda灵活的使用能减少省去一些只做简单处理的函数:

# 举个例子
# 原始代码
def fun1(x):
    return x+1

def fun2(x):
    return x**2

def fun3(x):
    return str(x)

a = 1
print(fun3(fun2(fun1(a))))


# 其效果等同于
lis = [lambda x: x + 1, lambda x: x ** 2, lambda x: str(x)]
print(lis[2](lis[1](lis[0](1))))

      文章2中说lambda可以接对象,如列表和词典。所以在对词典值进行排序的时候,我们会使用sorted()方法+lambda来代替直接循环词典的方式。

2 对词典排序的解析

      sorted(iterable, key, reverse)可以填三个参数:

  1. 第一个(iterable)是必填,为需要排序的对象;
  2. 第二个(key)为选填,为指定的排序;
  3. 第三个(reverse)为选填,为是否逆序,True为逆序,False为升序。默认False。

     对于词典key的排序很简单,直接使用sorted(dic)即可返回按key升序排列的列表结果。但对词典value的排序需要引入lambda,目的是获取词典中的value,从而辅助sorted()方法的选值。我们提供两种写法:

  1. 使用lambda x: dic[x] 获取词典中的值;
  2. 引入dic.items(),通过items返回的列表套元组对象(形如:[('a',1), ('b',3)..]),使用 lambda x: x[1]获取value。

     最后将获取的词典的值设置为sorted()方法中第二个参数指定排序对象key的值,完成我们的按值排序。

     下面是一些实验和结果用于参考:

dic = {'b': 1, 'c': 2, 'a': 3}
print(dic)
# {'b': 1, 'c': 2, 'a': 3}
print(sorted(dic))
# ['a', 'b', 'c']
print(sorted(dic, reverse=False))
# ['a', 'b', 'c']
print(sorted(dic, key=lambda x: dic[x], reverse=True))
# ['a', 'c', 'b']
print(sorted(dic.items(), key=lambda x: x[1], reverse=False))
# [('b', 1), ('c', 2), ('a', 3)]
print(dic.items())
# dict_items([('b', 1), ('c', 2), ('a', 3)])

3 总结

     一个lambda就是个小花式,可以代替某些“鸡肋def函数”,可以在以后的代码中活用起来。其次,sorted()方法排序,除了对单一列排序外,还能对多列元素排序(key的部分改写成lambda x: (x[1], x[0]),具体不赘述)。最后,弱弱的说一句,Pandas的sort_values()真香。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值