2

我想在这种情况下根据字典键“价格”列出字典列表中最大的两个和最小的两个项目 - 如下代码所示 - 使用 heapq 模块两个函数 nlargest() 和 nsmallest( )我尝试了这段代码,但它没有用:

import heapq


portfolio = [
    {'name': 'FACEBOOK', 'shares': 100, 'price': 91.1},
    {'name': 'MICROSOFT', 'shares': 50, 'price': 543.22},
    {'name': 'APPLE', 'shares': 200, 'price': 21.09},
    {'name': 'AMAZON', 'shares': 35, 'price': 31.75}
]


cheap = heapq.nsmallest(2, portfolio)
expensive = heapq.nlargest(2, portfolio)
print('the two cheap stocks:', cheap)
print('the two expensive stocks:', expensive)

然后我找到了一个使用 lambda 的解决方案,它确实有效!但我不明白:这是包含解决方案的版本,它可以工作,但我不明白在这种情况下使用 lambda:

import heapq


portfolio = [
    {'name': 'FACEBOOK', 'shares': 100, 'price': 91.1},
    {'name': 'MICROSOFT', 'shares': 50, 'price': 543.22},
    {'name': 'APPLE', 'shares': 200, 'price': 21.09},
    {'name': 'AMAZON', 'shares': 35, 'price': 31.75}
]
# the lambda solution
cheap = heapq.nsmallest(2, portfolio, key=lambda x: x['price'])
expensive = heapq.nlargest(2, portfolio, key=lambda x: x['price'])
print('the two cheap stocks:', cheap)
print('the two expensive stocks:', expensive)

这正是我所期望的输出:

the two cheap stocks: [{'name': 'APPLE', 'shares': 200, 'price': 21.09}, {'name': 'AMAZON', 'shares': 35, 'price': 31.75}]
the two expensive stocks: [{'name': 'MICROSOFT', 'shares': 50, 'price': 543.22}, {'name': 'FACEBOOK', 'shares': 100, 'price': 91.1}]

我希望在函数 nlargest 或 nsmallest 的参数键中找到使用 lambda 的一个很好的解释,并提前致谢。

4

1 回答 1

1

例如,当您有一个元素列表并想要对它们进行排序(或查找最大值等)时,您必须在不同元素之间进行比较。比较是if x > 3:,if x == y等操作。

现在,您的元素是字典。即,您有一个字典列表:

lst = [{'a': 'FACEBOOK', 'b': 100, 'c': 91.1},
       {'a': 'MICROSOFT', 'b': 50, 'c': 543.22}]

如果要查找此类列表的最大值,则需要比较字典。{'a': 'FACEBOOK', 'b': 100, 'c': 91.1}大于{'a': 'MICROSOFT', 'b': 50, 'c': 543.22}? _ 在您看来,它不是(因为 'c' 值)。但是 python 解释器不知道您想使用 'c' 键比较字典。这就是您需要该key参数的原因:它表示必须使用哪些数据来比较列表的两个元素。

在您的情况下,您告诉heapq班级使用与“价格”键关联的值来比较堆中的两个字典。

有关更多详细信息,请查看问题。

于 2020-10-30T16:35:14.900 回答