Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 你能帮我理解这个lambda函数吗?_Python_Python 3.x_Sorting_Lambda - Fatal编程技术网

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

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

我刚开始用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创建的变量。。。那么,它从哪里得到字符串??
我知道我只是很困惑…

考虑以下几点:

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