排序 sorted函数和lambda的组合应用(python3)
本笔记可以领会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
注:本文蓝色内容为本人原创(转载请注明出处),其他部分综合整理自不同的网络内容,出处见参考文献。