使用 heapq 模块的两个函数 nlargest() 和 nsmallest() 列出同一集合中最大的两项和最小的两项

make a list of the largest two and smallest two items of the same collection using the heapq module two functions nlargest() and nsmallest()

在这种情况下,我想根据字典键列出字典列表中最大的两项和最小的两项 'price' - 如下代码所示 - 使用 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 的很好的解释,在此先感谢。

当你有一个元素列表并且想要对它们进行排序(或找到最大值等)时,你必须在不同元素之间进行比较。比较是 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 class 通过使用与 'price' 键关联的值来比较堆中的两个字典。

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