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

我想按包含在其各自嵌套字典中具有最高“比率”值的字典的键的顺序遍历包含字典(键为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):

我现在正在阅读有关 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)

谢谢你的澄清。

4

2 回答 2

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 元组)并返回其元素之和的函数。

于 2012-12-08T21:19:08.553 回答
5

items()on 方法student_loan_portfolio.items()返回一个键/值元组列表。所以它返回类似[ ('loan1', dictOfLoan1), ('loan2', dictOfLoan2), ...]. lambda 接受这个元组作为参数,并从值 dict 中读取“rate”项(即,它读取dictOfLoan1['rate'],dictOfLoan2['rate']等)。

您可以通过使用而不是您拥有的 lambda 来实现相同的效果lambda item: item[1]['rate']item是一个元组(key, value)item[1]值也是。

您的两个 lambda 示例之间的区别在于,第一个接受三个参数,而第二个接受一个参数,该参数是一个三元素元组。定义一个接受元组作为参数但将其内容解包到单独的局部变量的函数的能力是 Python 的一个怪癖,在 Python 3 中被删除(参见PEP 3113)。

于 2012-12-08T21:19:06.393 回答