cde*_*ola 8 python lambda dictionary list-comprehension
我有以下字典:
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}
}
Run Code Online (Sandbox Code Playgroud)
我想按照包含在其各自嵌套字典中具有最高'rate'值的字典的键的顺序遍历包含字典(使用keys loan1到loan6).也就是说,我想按贷款3,贷款4,贷款1,贷款2,贷款6,贷款5的顺序进行迭代
感谢@Jame Sharp最简单的方法,我知道:
for k,v in sorted(student_loan_portfolio.items(), key=lambda (k,v): v['rate'], reverse=True):
Run Code Online (Sandbox Code Playgroud)
我现在正在阅读关于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)
Run Code Online (Sandbox Code Playgroud)
谢谢你的澄清.
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元组)的函数,并返回其元素的总和.
在items()
对方法student_loan_portfolio.items()
返回键/值元组的列表.所以它返回类似的东西[ ('loan1', dictOfLoan1), ('loan2', dictOfLoan2), ...]
.拉姆达接受该元组作为一个参数,并且读取从值字典(即,它读取"速度"项dictOfLoan1['rate']
,dictOfLoan2['rate']
等等).
你可以通过使用而不是lambda来实现相同的效果lambda item: item[1]['rate']
. item
是一个元组(key, value)
,item[1]
价值也是如此.
你的两个lambda示例之间的区别在于第一个接受三个参数,而第二个接受一个参数,它是一个三元素元组.定义一个接受元组作为参数但将其内容解包为单独的局部变量的函数的能力是Python的一个怪癖,在Python 3中被删除(参见PEP 3113).