Python 你能帮我理解这个lambda函数吗?
我刚开始用lambda函数来表达我的想法,这个函数真的让我发疯了。我知道我在这里的困难完全取决于我对lambda函数的理解,所以请大家接受我的每一个输入 给定一个带有空格分隔的数字的字符串(例如“128 555 3217 256”),该函数返回一个新字符串,按每个数字中所有数字的总和排序,如果两个值相等(如3215和256,都有13),则按字母顺序给出顺序Python 你能帮我理解这个lambda函数吗?,python,python-3.x,sorting,lambda,Python,Python 3.x,Sorting,Lambda,我刚开始用lambda函数来表达我的想法,这个函数真的让我发疯了。我知道我在这里的困难完全取决于我对lambda函数的理解,所以请大家接受我的每一个输入 给定一个带有空格分隔的数字的字符串(例如“128 555 3217 256”),该函数返回一个新字符串,按每个数字中所有数字的总和排序,如果两个值相等(如3215和256,都有13),则按字母顺序给出顺序 >>>_str = "128 555 3217 256" >>>print( ' '.join(sort
>>>_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创建的变量。。。那么,它从哪里得到字符串??
我知道我只是很困惑…考虑以下几点:
li = [2, 1, 3]
sorted_li = sorted(li, key=lambda x: x)
这个例子非常基本(为了这个例子,不必要地使用键
和lambda)
sorted
将li
中的每个元素传递给它为键
参数获取的函数,并期望返回一个值,该值将告诉它如何对列表进行排序(基本上,键
函数告诉sorted
元素如何相互比较)
在上面的示例中,键
函数接收一个元素,将其称为局部变量x
,并简单地按原样返回
在您的示例中,它对数字求和(在您的示例中,
x
是一组数字)。lambda作为一个等式,用于减少程序中的代码行数。
在这里
int(c)表示x中的c
x是总字符串,c是字符串,包含使用空格分隔的值
split(“”)。lambda作为参数
键
被传递到排序
。检查sorted()
函数的
key指定一个参数的函数,该参数用于从每个列表元素中提取比较键:key=str.lower。默认值为无(直接比较元素)
简单地说,键
,是一个有效地用作排序比较器的函数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()
使用这些总和按升序对字符串进行排序。的签名已排序(iterable[,key][,reverse])
key指定一个参数的函数,该参数用于从每个列表元素中提取比较键:key=str.lower。默认值为无(直接比较元素)
因此,对于默认值key=None
,sorted
将通过直接比较值进行排序。(即[2,3,1]
通过比较2<3
等进行排序)现在,如果为键指定一个函数foo
,该函数接受一个参数并返回一个值,排序的将在比较中使用foo
返回的值(即[2,3,1]
通过比较foo(2)进行排序)
等)
在您的例子中:sorted(_str.split(“”)),key=lambda x:sum(int(c)表示x中的c))
通过拆分字符串创建一个列表
,并使用key=lambda x:sum(int(c)表示x中的c)
对其进行排序,这样它将把每个空格分隔的子字符串x
传递给key
中的lambda,lambda将通过对其数字求和返回比较值sum(int(c)表示x中的c)
请注意,这不需要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