lambda函数在排序字典列表理解中

时间:2012-12-08 21:11:15

标签: python dictionary lambda 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}
}

我想按照包含在其各自嵌套字典中具有最高'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):

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

感谢您的澄清。

2 个答案:

答案 0 :(得分: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元组)的函数,并返回其元素的总和。

答案 1 :(得分:5)

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

使用lambda item: item[1]['rate']而不是lambda,你可以达到同样的效果。 item是元组(key, value),因此item[1]是值。

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