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

それぞれのネストされたディクショナリで「rate」値が最も高いディクショナリを含むキーの順に、含まれているディクショナリ(キーloan1からloan6)を繰り返し処理したいと思います。つまり、loan3、loan4、loan1、loan2、loan6、loan5の順に繰り返します。

@Jame Sharpのおかげで、私が知っているこれを行う最も簡単な方法は次のとおりです。

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

私は今ラムダについて読んでいますが、これがどのように、そしてなぜ機能するのかを正確に理解することはできません。まず、v['rate']はそれらの辞書キーの値を返していると思います。しかし、それはある種の構文エラーであるはずのようです。v ['rate']参照とは何ですか?構文の背後にあるロジックは何ですか?

関連する注意点として、ラムダ関数への入力をタプルとして指定する必要があるのはなぜですか?

そして、次の場合はどのように異なりますか?

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

ご説明ありがとうございます。

4

2 に答える 2

8

lambda (k,v): v['rate']は、単一の引数(2タプル)を取り、タプル'rate'の2番目のエントリのキーを返す関数です。と同等ですlambda t: t[1]['rate']

lambda x,y,z:x + y + z3つの値を取り、それらの合計を返す関数です。

lambda (x,y,z): x + y + z1つの値(3タプル)を取り、その要素の合計を返す関数です。

于 2012-12-08T21:19:08.553 に答える
5

onのitems()メソッドstudent_loan_portfolio.items()は、キー/値タプルのリストを返します。したがって、のようなものを返します[ ('loan1', dictOfLoan1), ('loan2', dictOfLoan2), ...]。ラムダはこのタプルを引数として受け入れ、値dictから「rate」アイテムを読み取ります(つまり、、などを読み取りますdictOfLoan1['rate']dictOfLoan2['rate']

ラムダの代わりに、を使用して同じ効果を得ることができますlambda item: item[1]['rate']itemタプル(key, value)であるためitem[1]、値も同様です。

2つのラムダの例の違いは、最初の例は3つの引数を受け入れ、2番目の例は3要素のタプルである単一の引数を受け入れることです。タプルを引数として受け入れるが、その内容を個別のローカル変数にアンパックする関数を定義する機能は、Python 3で削除されたPythonの癖でした(PEP 3113を参照)。

于 2012-12-08T21:19:06.393 に答える