你能帮我理解这个lambda函数吗?

时间:2017-07-02 08:04:54

标签: python python-3.x sorting 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

我真正没有得到的是,显然lambda只在这里使用仅为函数x和c创建的变量...所以,它在哪里得到字符串? 我知道我很困惑......

4 个答案:

答案 0 :(得分:4)

lambda作为参数sorted传递给key。查看sorted()功能的documentation

  

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

简单来说,key是一个有效用作排序比较器的函数。 sorted根据列表的输出对列表进行排序,而不是单独确定元素的顺序。

传递给sorted()的lambda取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的元素是一个字符串,表示要获得总和的数字。然后lambda遍历它们,将它们转换为整数,并返回它们的总和。

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

答案 1 :(得分:3)

请考虑以下事项:

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

这个例子非常基本(为了这个例子,不必要地使用key和一个lambda)。

sortedli中的每个元素传递给它为key参数获取的函数,并期望返回一个值,告诉它如何对列表进行排序(基本上, key函数告诉sorted元素如何相互比较)。

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

在您的示例中,它对数字求和(在您的示例中x是一组数字)。

答案 2 :(得分:2)

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

  

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

因此,对于默认值key=Nonesorted只会直接比较值进行排序。 (即[2,3,1]通过比较2 < 3等进行排序。现在,如果为foo指定函数key,则接受一个参数并返回一个值{{1而是在比较中使用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)传递给x中的lambda,这将通过将其数字key相加来返回比较值。

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

sum(int(c) for c in x)

并改为通过def foo(x): return sum(int(c) for c in x)

foo

答案 3 :(得分:0)

lambda作为一个方程式,用于减少程序中的代码行数。 这里     int(c)表示c中的c x是总字符串,c是字符串,包含在使用时按空格分隔的值 分裂('')。