2012-07-23 20 views
2

有人可以详细说明下面的语句是如何工作的吗?使用Python排序模块的Python lamba函数

我的问题与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)] 

回答

0

但如何做 “学生” 名单是由Python lambda函数的认可..

记住Python是动态类型。拉姆达不知道student是什么,它解压缩并尝试使用它。它是python中的一个名称。 student可能是一个整数,一个列表,一个对象,或其他。在执行lamba key并且python认识到student不可转位之前,不会进行验证。

0

我觉得不被认可。学生只是你放到对象上的名字,可能是x,就像在 >>>sorted(student_tuples, key=x: x[2]) 如果你的对象不是列表,或者没有'2'元素,你会得到一个错误。

2

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

因此,对于你的榜样,您有:

lambda student: student[2] 

这基本上等同于类似如下的功能:

def get_my_key(item): 
    return item[2] 

所以排序的序列时,它是在调用此get_my_key功能每个项目检索实际的密钥。

0

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

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

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

+1很好的例子 – 2012-07-23 15:21:22

0

lambda student: student[2]仅仅是一个功能和student是它的参数,它也可能是:

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

所以这是怎么回事的是,你是给分类列表和操作上的功能每一个项目,它将基于该函数的结果

列表排序从sorteddocumentation

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

所以,你可以使用任何功能分类和lambda函数只是(没有名字的函数)一种匿名函数的