Python lambda函数与Python排序模块

时间:2012-07-23 15:15:48

标签: python

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

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

>>> 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)]

6 个答案:

答案 0 :(得分: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)]

答案 1 :(得分:2)

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

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

lambda student: student[2]

这基本上相当于一个如下所示的函数:

def get_my_key(item):
    return item[2]

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

答案 2 :(得分:0)

我认为不被承认。学生只是你给对象的名字,可能是x,就像在 >>>sorted(student_tuples, key=x: x[2]) 如果您的对象不是列表,或者没有'2'元素,则会出现错误。

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

  

但"学生" list由lambda函数识别..

记住python是动态类型的。 lambda在解包并尝试使用它之前不知道student是什么。它是python中的某个名称。 student可以是整数,列表,对象等等。在执行lamba key并且python意识到student无法编入索引之前,不会进行验证。

答案 5 :(得分:0)

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

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

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

来自sorted documentation

  

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

所以你可以使用任何函数进行排序,而lambda函数只是一种匿名函数(没有名字的函数)