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

Python 使用heapq模块的两个函数NLAGEST()和nsmallest()列出同一集合中最大的两项和最小的两项,python,list,dictionary,lambda,heapq,Python,List,Dictionary,Lambda,Heapq,我想使用heapq模块的两个函数NLAGEST()和nsmallest(),根据本例中的dictiony键“price”,列出字典列表中最大的两项和最小的两项,如下代码所示 我尝试了此代码,但无效: import heapq portfolio = [ {'name': 'FACEBOOK', 'shares': 100, 'price': 91.1}, {'name': 'MICROSOFT', 'shares': 50, 'price': 543.22}, {'n

我想使用heapq模块的两个函数NLAGEST()和nsmallest(),根据本例中的dictiony键“price”,列出字典列表中最大的两项和最小的两项,如下代码所示 我尝试了此代码,但无效:

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在这种情况下的用法:

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

我希望在函数NLAGEST或nsmallest的参数键中找到lambda用法的好解释,并提前表示感谢。

当您有一个元素列表,并希望对它们进行排序(或查找最大值等)时,您必须在不同的元素之间进行比较。比较是类似于
如果x>3:
如果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”键比较字典。这就是为什么需要
参数的原因:它表示必须使用哪些数据来比较列表中的两个元素

在本例中,您告诉
heapq
类使用与“price”键关联的值来比较堆中的两个字典


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

您的第一次尝试失败,因为字典之间没有定义的相对顺序。为什么您希望结果是基于
“价格”
,而不是现有的其他两个键进行排名?这些函数(以及Python中与排序相关的各种其他函数)的
key
参数允许您指定比较元素的基础。