我刚刚开始尝试使用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创建的变量...所以,它在哪里得到字符串? 我知道我很困惑......
答案 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)。
sorted
将li
中的每个元素传递给它为key
参数获取的函数,并期望返回一个值,告诉它如何对列表进行排序(基本上, key
函数告诉sorted
元素如何相互比较)。
在上面的例子中,key
函数接收一个元素,将其称为局部变量x
,并按原样返回它。
在您的示例中,它对数字求和(在您的示例中x
是一组数字)。
答案 2 :(得分:2)
sorted
的签名为sorted(iterable[, key][, reverse])
。
key指定一个参数的函数,该函数用于从每个列表元素中提取比较键:key = str.lower。默认值为None(直接比较元素)。
因此,对于默认值key=None
,sorted
只会直接比较值进行排序。 (即[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是字符串,包含在使用时按空格分隔的值 分裂('')。