2

有人可以详细说明以下语句的工作原理吗?

我的问题与 lambda 函数有关吗?lambda 语句将学生作为输入并返回 (student[2]) 列表中的第二个元素。我知道我们有 student_tuples 作为列表,但是 Python lambda 函数如何识别“学生”列表。

>>> student_tuples = [
        ('john', 'A', 15),
        ('jane', 'B', 12),
        ('dave', 'B', 10),
]
>>> sorted(student_tuples, key=lambda student: student[2])   # sort by age
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
4

6 回答 6

4

lambda 无法识别整个列表。只有要排序的列表中的单个成员被传递。

>>> def age(student):
...   print "member: %s" % repr(student)
...   return student[2]
... 
>>> sorted(student_tuples, key=age)
member: ('john', 'A', 15)
member: ('jane', 'B', 12)
member: ('dave', 'B', 10)
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
于 2012-07-23T15:20:01.837 回答
2

因为参数sortedkey一个单参数函数,它需要接受被排序的序列中的一个元素,并返回被认为是该元素的“键”的东西。在您的情况下,它是每个元组中的第三项。因此,不是按照通常的方式对元组进行排序(基于从左到右的值),而是说每个元组都有一个“键”,可以更好地表示它们应该如何排序,它是每个元组中的第三个值元组。

因此,对于您的示例,您有:

lambda student: student[2]

这基本上等同于如下所示的函数:

def get_my_key(item):
    return item[2]

因此,在对序列进行排序时,它会get_my_key在每个项目上调用此函数来检索实际的键。

于 2012-07-23T15:19:03.917 回答
0

我认为是不认可的。student 只是你给对象取的名字,可以是x,比如 >>>sorted(student_tuples, key=x: x[2]) 如果你的对象不是列表,或者没有 '2' 元素,你会得到一个错误。

于 2012-07-23T15:19:01.080 回答
0

sorted函数的key参数采用单个参数的函数(在本例中为 lambda)。当 sorted 遍历输入列表时,它使用key函数来获取排序值,在本例中,是输入元组中的第三项。

lambda 中的student名称只是一个名称,您可以使用lambda x: x[2]相同的效果。

于 2012-07-23T15:19:22.143 回答
0

但是Python lambda函数如何识别“学生”列表..

记住 python 是动态类型的。studentlambda在解包并尝试使用它之前不知道是什么。它是python中某些东西的名称。student可以是整数、列表、对象或其他任何东西。在执行 Lambakeypython意识到它student不可索引之前,不会进行任何验证。

于 2012-07-23T15:19:52.283 回答
0

lambda student: student[2]只是一个函数并且student是它的参数,它也可以是:

sorted(student_tuples, key=lambda x: x[2])

所以这里发生的事情是你给出了一个排序列表和一个对每个项目进行操作的函数,它将根据该函数的结果对列表进行排序

sorted 文档

cmp 指定两个参数(可迭代元素)的自定义比较函数,该函数应返回负数、零或正数,具体取决于第一个参数被认为小于、等于还是大于第二个参数: cmp=lambda x,y : cmp(x.lower(), y.lower())。默认值为无。

So you could use any function for sorting, and lambda function is just a type of anonymous function (a function without a name)

于 2012-07-23T15:20:02.320 回答