2012-12-08 33 views
8

मैं निम्नलिखित शब्दकोश है:लैम्ब्डा समारोह

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} 
} 

मैं (के साथ कुंजी loan6 के माध्यम से loan1) युक्त शब्दकोश के माध्यम से पुनरावृति करने के लिए उच्चतम साथ शब्दकोश युक्त कुंजी के क्रम में चाहते हैं अपने रेटेड नेस्टेड डिक्शनरी में 'रेट' वैल्यू। यही कारण है,

है मैं loan3, loan4, loan1, loan2, loan6 के क्रम में पुनरावृति करना चाहते हैं, loan5 @Jame तीव्र के लिए धन्यवाद यह है कि मैं जानता हूँ कि सबसे आसान तरीका:

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

मैं अब मैं लैम्ब्डा के बारे में पढ़ रहा हूं और वास्तव में यह नहीं समझ सकता कि यह कैसे और क्यों काम करता है। पहला, वी ['दर'] मेरा मानना ​​है कि उन शब्दकोश कुंजी के मूल्य को वापस कर रहा है। लेकिन ऐसा लगता है कि यह किसी प्रकार की वाक्यविन्यास त्रुटि होनी चाहिए। वी ['दर'] संदर्भ क्या है और वाक्यविन्यास के पीछे तर्क क्या है?

संबंधित नोट पर, हमें लैम्ब्डा फ़ंक्शन में इनपुट को टुपल के रूप में निर्दिष्ट करना क्यों है?

और निम्नलिखित मामले अलग कैसे हैं?

#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 इनपुट के साथ पैक किए गए इनपुट की अपेक्षा करता है? 'एफ ((1,2,3))' –

उत्तर

5

items()student_loan_portfolio.items() पर विधि कुंजी/मान tuples की एक सूची देता है। तो यह [ ('loan1', dictOfLoan1), ('loan2', dictOfLoan2), ...] जैसे कुछ देता है। लैम्ब्डा इस टुपल को तर्क के रूप में स्वीकार करता है, और मूल्य दर से "दर" आइटम पढ़ता है (यानी, यह dictOfLoan1['rate'], dictOfLoan2['rate'] इत्यादि पढ़ता है)।

आप लैम्बडा के बजाय, lambda item: item[1]['rate'] के बजाय उपयोग करके उसी प्रभाव को प्राप्त कर सकते हैं। item एक tuple (key, value) है, इसलिए item[1] मूल्य है।

आपके दो लैम्ब्डा उदाहरणों के बीच का अंतर यह है कि पहला व्यक्ति तीन तर्क स्वीकार करता है, जबकि दूसरा एक एकल तर्क स्वीकार करता है जो तीन-तत्व ट्यूपल होता है। एक फ़ंक्शन को परिभाषित करने की क्षमता जो तर्कों के रूप में tuples को स्वीकार करती है लेकिन अलग-अलग स्थानीय चरों में उनकी सामग्री को अनपैक करती है वह पाइथन 3 का एक क्विर्क था जिसे पायथन 3 में हटा दिया गया था (PEP 3113 देखें)।

+0

ठीक है धन्यवाद @ ब्रेनबर्न। मैंने कुछ और प्रयोग किया और इसलिए कारण v ['दर'] वाक्यविन्यास त्रुटि नहीं है क्योंकि v एक शब्दकोश है, है ना? – cdelsola

+0

@ उपयोगकर्ता 1816858: हाँ, मूल रूप से। आपके पास एक शब्दकोश है जिसका मूल्य भी शब्दकोश हैं। (यदि यह एक शब्दकोश नहीं था, तो यह अभी भी * वाक्यविन्यास * त्रुटि नहीं होगी, लेकिन अगर आपको '[]' का उपयोग करके आइटम एक्सेस का समर्थन नहीं किया गया है तो आपको एक त्रुटि मिलेगी।) – 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-ट्यूपल) लेता है, और इसके तत्वों का योग देता है।