有人可以解释这些lambda吗?我对以下代码感到相当困惑,希望能从了解此事的人那里获得一些帮助,以帮助他们理解代码,并且可以将代码分解为可理解的组件。
convert = lambda text: int(text) if text.isdigit() else text
alphanum_key = lambda key: [convert(c) for c in re.split('([0-9]+)', key)]
return sorted(l, key = alphanum_key)
(来源:https://arcpy.wordpress.com/2012/05/11/sorting-alphanumeric-strings-in-python/)
我了解第一个lambda。
对于第二个alphanum_key
,我感到困惑。似乎已将密钥传递给lambda并在split()
模块的re
函数中使用了,但是我看不到key
传递给alphanum_key
lambda在sorted()
函数中调用此lambda时。
我写了一个小程序,看看是否可以通过返回值并像函数一样被调用的lambda创建正常的def
函数。这是我的代码:
import re
def convert2(text):
if text.isdigit():
return int(text)
else:
return text
def alphanum_key2(key):
a_list = []
for i in re.split('([0-9]+)', key):
a_list.append(convert2(i))
return a_list
if __name__ == "__main__":
things = ["10bags", "500miles", "10000maniacs", "2000lightYearsFromHome"]
x = sorted(things, key= alphanum_key2)
print(x)
#This prints
#['10bags', '500miles', '2000lightYearsFromHome', '10000maniacs']
convert = lambda text: int(text) if text.isdigit() else text
alphanum_key = lambda key: [convert(c) for c in re.split('([0-9]+)', key)]
print(sorted(things, key = alphanum_key))
#This prints
#['10bags', '500miles', '2000lightYearsFromHome', '10000maniacs']
这导致了第二个问题...为什么模拟Lambda函数的普通def
函数返回不同且错误的结果。如果您不希望在计算机上运行该程序,请注意代码注释中返回的结果。
答案 0 :(得分:1)
您说您了解第一个功能convert
,所以我不再赘述;只是要知道它返回的是字符串还是整数。
第二个从lambda的直接转换是:
def alphanum_key(key):
return [convert(c) for c in re.split('([0-9]+)', key)]
让我们分解一下。
[... for ...]
这是列表理解。它将为for
的每次迭代创建一个包含元素的列表。
re.split('([0-9]+)', key)
这使用由所有数字([0-9]
)重复一次或多次(+
)组成的正则表达式。通过在该表达式两边加上括号,这些匹配项将包含在split
的输出中。
>>> re.split('([0-9]+)', "10bags")
['', '10', 'bags']
由于split
在比赛中将字符串分开,并在比赛之前和之后返回部分,因此开头有一个空字符串。
alphanum_key
的最终输出将为['', 10, 'bags']
,因为'10'
将被转换为整数10
。这很重要,因为您要比较数字:
>>> '10000' < '500'
True
>>> 10000 < 500
False