欢迎光临散文网 会员登陆 & 注册

排序 sorted函数和lambda的组合应用(python3)

2023-07-23 09:33 作者:biggertree-Jing  | 我要投稿

本笔记可以领会sorted()排序函数与lambda匿名函数的用法

sorted()函数和lambda函数的应用,能有效提高代码效率,但初学者容易混淆,下面对这两个函数及其应用进行分拆讲解。

一、关于函数sorted()

sorted() 函数对所有可迭代的对象进行排序操作。sorted的语法如下:

sorted(iterable, key=None, reverse=False)

参数说明:

  • iterable -- 可迭代对象。

  • key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。

  • reverse -- 排序规则,reverse = True 降序 , reverse = False 升序(默认)。

返回值:重新排序的列表。

二、关于函数lambda:

匿名函数lambda:是指一类无需定义标识符(函数名)的函数或子程序。lambda 函数可以接收任意多个参数 (包括可选参数) 并且返回单个表达式的值。

lambda匿名函数的格式:冒号前是参数,可以有多个,用逗号隔开,冒号右边的为表达式。其实lambda返回值是一个函数的地址,也就是函数对象。

需要要注意的是:lambda 函数包含的表达式只能是一个。

例如,定义一个返回数的平方的lambda:

a=lambda x:x*x

print(a(3))    

那么输出值是:9

 如果我们只需要一个简单的函数,lambda 是一个很好的选择,因为它可以被看作是定义函数的一种更简单的方法。因此,我们可以给它一个名称,并像普通函数一样使用它。add_ten() 和 lambda_add_ten() 方法的结果是相同的,但是 lambda 函数可以使我们的代码更短更清晰。如以下简单函数:

Python中使用lambda的话,写成这样

lambda包含的表达式不能超过一个。任何能够使用它的地方,都可以定义一个单独的普通函数来进行替换。我将它用在需要封装特殊的、非重用代码上,避免代码充斥着大量单行函数。

三、几个实际案例

看到几个sorted与lambda的例子,很有代表性,了解了这些,这两个函数使用就容易理解了

1. 对列表中的数字按字符串长度排序

b=sorted([13,1,237,89,100], key=lambda x: len(str(x)))

print(b)

----------------------------------------------------------------------

[1, 13, 89, 237, 100]

刚看到这段代码有点绕不开了,仔细拆开,就迎刃而解了。

首先,sorted里面是两个参数,一个是数列[13,1,237,89,100],另一个是lambda函数:key=lambda x: len(str(x)),这里最容易混淆的是key,可能有人会把他当成定义的lambda函数名,其实key是sorted函数中的参数名称关键字。因此,这里就是对数列按照llambda函数返回值进行排序,也就是按照转换成字符串长度排序。

很明显,按照转换的字符串长度,数列[13,1,237,89,100]长度应该依次是:[2,1,3,2,3]。

因此,对数列[13,1,237,89,100]按长度排列结果如下:

[1, 13, 89, 237, 100]

 

2. 按列表内运算结果排序

x=[[1,3,3],[2,3,1]]

y=sorted(x, key=lambda item:item[0]+item[2])

print(y)

--------------------------------------------------------------

[[2, 3, 1], [1, 3, 3]]

例子1中已经讲了sorted()函数的结构和key的作用。很明显这是对两个列表按照列表中第0和第2个的和排序,第1个列表第0个和第2个是1+3=4,第2个列表第0个和第2个是2+1=3,第1个列表值大于第2个列表的,因此第2个列表前移,得到结果:

[[2, 3, 1], [1, 3, 3]]

 

3. 对元组按元组元素值排序 

 

x=[('a', 3), ('b',4), ('c',1)]

r=sorted(x, key=lambda y:y[1])

print(r)

--------------------------------------

[('c', 1), ('a', 3), ('b', 4)]

很明显,这个表达式是对x元组列表按照每个元组第2个元素排列,结果如下:

[('c', 1), ('a', 3), ('b', 4)]

4.将字符串,按照字符中的数字进行排序

在Python中,如果要按照字符串中的数字进行排序,需要使用自定义排序方法。Python内置的排序方法只能按照字符串的字典序进行排序。我们可以通过对字符串中数字的提取和比较来实现正确的排序。如果通过普通的Python函数来实现,代码如下:

在上面的示例代码中,我们定义了一个convert_text()函数,用于对每个字符串进行分割和提取,并将其转换为元组(a,b),其中a是不包含数字的字符串,b是数字字符串的转换结果。然后,我们使用sorted()函数对字符串数组进行排序,指定key=convert_text即可按照convert_text()函数的返回值进行排序。

在这个示例中,我们使用了正则表达式来将数字和非数字字符分割开来,并对数字字符串进行了转换。这个方法不光适用于单个数字的字符串,也可以处理包含多个数字的字符串。

当我们运行代码时,输出结果为:

普通函数虽然能够解决这个自定义排序的问题,但是不简洁,使用lambda会更加简单,见以下代码(原创):

运行结果亦为:

可见,使用lambda一行代码sorted(arr,key=lambda x: int(x[1:])) 即可高效解决问题。

5. 将字符串,按照字符中的数字进行排序,另一案例

先看需要排序的数据:

上图,列表a中嵌套列表,请按照嵌套列表的第三项“S+数字”中的数字进行排序。由于列表元素“S+数字”中的“数字”此时是字符串类型的数据,必须先转换成整数类型数据,才能按数字排序,使用lambda可以快速实现目标,代码如下(原创):

运行结果:

使用lambda,又是一行代码搞定。

以上内容,对sorted()和lambda函数的组合应用进行了分析,希望对大家有所帮助。

参考文献:

https://www.runoob.com/python3/python3-func-sorted.html

https://www.cnblogs.com/kaishirenshi/p/8611358.html

https://www.cnblogs.com/huigebj/p/11433896.html

https://www.cnblogs.com/loveu123/p/12682480.html

https://baijiahao.baidu.com/s?id=1746742334772754606

https://deepinout.com/python/python-qa/t_how-to-correctly-sort-a-string-with-a-number-inside-in-python.html


注:本文蓝色内容为本人原创(转载请注明出处),其他部分综合整理自不同的网络内容,出处见参考文献。


排序 sorted函数和lambda的组合应用(python3)的评论 (共 条)

分享到微博请遵守国家法律