2015-08-21 64 views
0

我的元组Python的 - 功能分配给变量

student_tuples = [ 
    ('john', 'A', 15), 
    ('jane', 'B', 12), 
    ('dave', 'B', 10), 
] 

我一直在尝试不同的方法来解决这,使用itemgetter和lambda函数的列表。通过元组的两个索引排序可以通过itemgetting和lambda函数完成,但它必须返回一个元组。我似乎无法在文档中找到关键函数在元组上运行的任何地方。

无论如何,我想知道itemgetter()实际返回,所以此工程(从itemgetter文档复制):

f = itemgetter(1) 
print f(student_tuples[0]) 
----->A 

有没有办法做到这一点,而不必itemgetter重新分配给一个变量?它看起来像两个参数正在通过,但像

print itemgetter(1, student_tuples[0]) 
-----><operator.itemgetter object at 0xf7309c8c> 

不给我任何有用的东西。

我只是在努力学习Python,这让我感到困惑。我不知道itemgetter中的student_tuples [0]被添加为参数。

回答

2

您需要再次调用返回值itemgetter(),而不是作为第二个参数传入列表中。实施例 -

itemgetter(1)(student_tuples[0]) 

如可以从文档中可以看出 -

operator.itemgetter(*项)

返回一个可调用对象,使用操作数的__getitem__()从它的操作数取出项目方法。

itemgetter()返回一个功能,它可以再次调用通过在实际迭代,从在迭代特定指数中获得的价值。

当您将多个值传递给itemgetter()时,它仍然会返回一个函数,调用该函数会尝试使用您最初作为元组传递给itemgetter()的索引来获取迭代中的元素。实施例 -

>>> l =[1,2,3,4,5] 
>>> operator.itemgetter(1,2,4)(l) 
(2, 3, 5) 
3

itemgetter(1)返回值是一个功能(实际上,一个可调用的对象,但它的使用的功能等)。

它返回的功能是大致相当于从表达结果的功能:

lambda x: x[1] 

student_tuples[0]itemgetter不添加作为参数的任何地方。它被作为参数传递给当你调用f(student_tuples[0])时返回的函数。

由于fitemgetter(1)的结果,它遵循的是您可以在一个行做到这一点:

itemgetter(1)(student_tuples[0]) 
+0

谢谢,清除它。通常使用itemgetter,attrgetter等,或者使用lambda函数可以使用吗?他们在排序的背景下看起来相当紧凑,但我是一个新手,所以也许还有其他用途,其中itemgetter是远远优于其他用途。 – jktstance

+0

@jktstance:我个人认为其中没有太多内容,但有些人强烈反感lambda,并认为首先在语言中不需要他们。我通常不会为'itemgetter'的单次使用导入'operator',但如果我使用'operator',那么我认为它是值得的。在某些情况下,您可能还想比较两者的表现并选择更快的方式。 –