lambda-Funktion sortiert die Wörterbuch-Liste Verständnis
Habe ich Folgendes Wörterbuch:
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}
}
Möchte ich Durchlaufen und die mit Wörterbuch (mit Schlüssel loan1 durch loan6) in der Reihenfolge der Schlüssel mit dem Wörterbuch mit der höchsten rate " - Wert in seinem jeweiligen verschachtelten dictionary. Das heißt, ich möchte zu iterieren in der Reihenfolge der loan3, loan4, loan1, loan2, loan6, loan5
Dank @Jame Scharf der einfachste Weg, dies zu tun, die ich kenne, ist:
for k,v in sorted(student_loan_portfolio.items(), key=lambda (k,v): v['rate'], reverse=True):
Ich bin jetzt beim Lesen über lambda und nicht wirklich genau verstehen, wie und warum das funktioniert.
Erstens, v['rate'] ich glaube, dass ist die Rücksendung den Wert der dictionary-Schlüssel. Aber Ihr scheint, wie es sollte eine Art syntax-Fehler. was ist v['rate'] verweisen, und was ist die Logik hinter der syntax?
Auf ein zugehöriger Hinweis, warum, müssen wir angeben, die Eingaben für die lambda-Funktion als ein Tupel?
"Und wie sind die folgenden Fälle unterscheiden?
#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)
Danke für die Klarstellung.
- der zweite, erwartet man ein verpackt-Eingang mit 3-Werte?
f((1,2,3))
- Zweite format nicht gültig in Python 3, FYI
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
items()
Methode aufstudent_loan_portfolio.items()
gibt eine Liste von Schlüssel/Wert-Tupeln. Also es gibt so etwas wie[ ('loan1', dictOfLoan1), ('loan2', dictOfLoan2), ...]
. Der lambda-Ausdruck nimmt diese Tupel als argument und liest die "rate" - Element aus dem Wert dict (d.h., es liestdictOfLoan1['rate']
,dictOfLoan2['rate']
usw.).Könnten Sie den gleichen Effekt erzielen, indem Sie anstelle der lambda-Sie haben
lambda item: item[1]['rate']
.item
ist ein Tupel(key, value)
, soitem[1]
ist der Wert.Den Unterschied zwischen den beiden lambda-Beispiele ist, dass die ersten drei Argumente akzeptiert, während die zweite akzeptiert ein einzelnes argument, das ist ein drei-Tupel-element. Die Fähigkeit, eine Funktion definieren, die akzeptiert Tupel als Argumente aber entpackt Ihren Inhalt in separaten lokalen Variablen war eine Eigenart von Python entfernt wurde in Python 3 (siehe PEP 3113).
[]
.)lambda (k,v): v['rate']
ist eine Funktion mit einem einzigen argument (ein 2-Tupel), und gibt die'rate'
Schlüssel, der zweite Eintrag im Tupel. Es entsprichtlambda t: t[1]['rate']
lambda x,y,z:x + y + z
ist eine Funktion, die 3 Werte und gibt Ihre Summe.lambda (x,y,z): x + y + z
ist eine Funktion, die nimmt den Wert 1 (3-Tupel), und gibt die Summe seiner Elemente.