2012-12-08 58 views
8

我有以下的解釋:lambda函數

student_loan_portfolio = { 
    'loan1': {'rate': .078, 'balance': 1000, 'payment': 100, 'prepayment': 0}, 
    'loan2': {'rate': .0645, 'balance': 10, 'payment': 5, 'prepayment': 0}, 
    'loan3': {'rate': .0871, 'balance': 250, 'payment': 60, 'prepayment': 0}, 
    'loan4': {'rate': .0842, 'balance': 200, 'payment': 37, 'prepayment': 0}, 
    'loan5': {'rate': .054, 'balance': 409, 'payment': 49, 'prepayment': 0}, 
    'loan6': {'rate': .055, 'balance': 350, 'payment': 50, 'prepayment': 0} 
} 

我想通過含詞典(與鍵loan1通過loan6)迭代中含有最高的字典中鍵的順序'rate'值在其各自的嵌套字典中。也就是說,我想在loan3,loan4,loan1,loan2,loan6的順序進行迭代,loan5

由於@Jame夏普要做到這一點,我知道最簡單的方法是:

for k,v in sorted(student_loan_portfolio.items(), key=lambda (k,v): v['rate'], reverse=True): 

我我現在正在閱讀關於lambda的內容,並且無法真正理解這個工作原理的方式和原因。 首先,v ['rate']我相信會返回這些字典鍵的值。但它似乎應該是某種語法錯誤。什麼是v ['rate']引用以及語法背後的邏輯是什麼?

在相關說明中,爲什麼我們必須將lambda函數的輸入指定爲元組?

以下情況如何不同?

#1 

>>>f = lambda x,y,z:x + y + z 
>>>f(1,2,3) 

#6 

>>>f = lambda (x,y,z): x + y + z 
>>>f(1,2,3) 

Traceback (most recent call last): 
    File "<pyshell#48>", line 1, in <module> 
    f(1,2,3) 
TypeError: <lambda>() takes exactly 1 argument (3 given) 

謝謝您的澄清。

+3

第二個預計3值的打包輸入? 'f((1,2,3))' –

回答

5

student_loan_portfolio.items()上的items()方法返回鍵/值元組列表。所以它返回類似[ ('loan1', dictOfLoan1), ('loan2', dictOfLoan2), ...]。 lambda接受該元組作爲參數,並從值字典中讀取「rate」項(即,它讀取dictOfLoan1['rate'],dictOfLoan2['rate']等)。

你可以通過使用,而不是你有lambda,lambda item: item[1]['rate']達到相同的效果。 item是一個元組(key, value),所以item[1]是值。

你的兩個lambda例子的區別在於第一個接受三個參數,而第二個接受三個元組的元組。定義一個接受元組作爲參數但將其內容解壓縮到單獨局部變量的函數的能力是Python 3的一個怪癖(參見PEP 3113)。

+0

好的,謝謝@BrenBarn。我做了一些更多的實驗,所以v ['rate']的原因不是語法錯誤,因爲v是一個字典,對吧? – cdelsola

+0

@ user1816858:是的,基本上。你有一本字典,其值也是字典。 (如果它不是字典,它仍然不是*語法*錯誤,但如果它不支持使用'[]'的項目訪問,則會出現錯誤。) – BrenBarn

8

lambda (k,v): v['rate']是一個函數,它接受單個參數(2元組),並返回元組中第二個條目的'rate'鍵。它相當於lambda t: t[1]['rate']

lambda x,y,z:x + y + z是一個函數,它取3個值並返回它們的總和。

lambda (x,y,z): x + y + z是一個函數,它接受1個值(一個3元組),並返回其元素的總和。