2017-07-02 89 views
-1

我刚刚开始用lambda函数弄湿我的脚,这真的让我发疯。我知道我在这里的困难仅仅取决于我对lambda函数的一般理解力弱,所以请每个输入都被接受。你能帮我理解这个lambda函数吗?

给定一个空格分隔字符串的字符串(例如“128 555 3217 256”),函数返回一个新的字符串,按每个数字中所有数字的总和排序,如果有两个相等的值(如3215和256,都有13),命令是按字母顺序给出的。

>>>_str = "128 555 3217 256" 
>>>print(' '.join(sorted(sorted(_str.split(' ')), key=lambda x: sum(int(c) for c in x)))) 
128 256 3217 555 

我真的不明白的是,显然拉姆达仅在这里工作,只有在功能,X和C创建的变量...那么,它得到的字符串? 我知道,我只是很困惑......

回答

3

考虑以下几点:

li = [2, 1, 3] 
sorted_li = sorted(li, key=lambda x: x) 

这个例子是非常基本的(并为示范起见,不必要使用key和拉姆达)。

sortedli传递每个元素它得到了key参数的函数,并希望得到一个值,该值将告诉它如何对列表进行排序(基本上,key函数告诉sorted元素如何互相比较)。

在上面的例子中,key函数接收一个元素,将其称为局部变量x,并将其原样返回。

在你的例子中,它总结了数字(在你的例子中x是一组数字)。

0

lambda可用作等式并用于减少程序中的代码行数。 Here int(c)for c in x x是总字符串,c是字符串包含空格的分隔值,如您使用 split('')。

4

该lambda被传递给sorted作为参数key。查看documentationsorted()函数。

key指定一个用于从每个列表元素提取比较键的参数的函数:key = str.lower。默认值是None(直接比较元素)。

简而言之,key是一种有效用作排序比较器的函数。 sorted根据它的输出对列表进行排序,而不是找出元素应该自己排列的顺序。

您传递给sorted()的拉姆达需要x,因为它只是参数。 sorted()然后将它正在排序的列表中的每个元素传递给该lambda,因此在lambda中对x的任何引用都对应于该元素。

key=lambda x: sum(int(c) for c in x))) 
#^  ^
#Key arg x is the lambda's only argument 

在你的情况下,被传递到拉姆达元素是一个字符串,表示要得到的总和谁的位数。 lambda然后遍历它们,将它们转换为整数,并返回它们的总和。

一旦完成,sorted()使用这些总和来按升序对字符串进行排序。

2

sorted的签名是sorted(iterable[, key][, reverse])

key指定一个用于从每个列表元素提取比较键的参数的函数:key = str.lower。默认值是None(直接比较元素)。

因此,对于key=None的默认值,sorted将通过直接比较值进行排序。现在(即[2,3,1]通过比较2 < 3等排序),如果你指定一个函数fookey,接受一个参数并返回一个值,sorted将改用由foo返回的值进行比较(即[2,3,1]通过比较排序foo(2) < foo(3)等)

你的情况:sorted(_str.split(' ')), key=lambda x: sum(int(c) for c in x))

通过分割字符串创建list,并与key=lambda x: sum(int(c) for c in x)排序,所以它会通过在key分离子x到拉姆达每个空间,这将返回比较值总结其数字sum(int(c) for c in x)

请注意,这不需要lambda函数,它只需要一个具有正确签名的函数 - 即接受一个参数并返回一个可以进行比较的函数。所以我们可以定义:

def foo(x): 
    return sum(int(c) for c in x) 

并且通过foo代替。

>>> print(' '.join(sorted(sorted(_str.split(' ')), key=foo))) 
128 256 3217 555