微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用heapq模块的两个函数nlargest和nsmallest

如何解决使用heapq模块的两个函数nlargest和nsmallest

在这种情况下,我想基于字典键在字典列表中列出最大的两个项目和最小的两个项目,如代码所示(使用代码如下),使用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','price': 31.75}
]
# the lambda solution
cheap = heapq.nsmallest(2,portfolio,key=lambda x: x['price'])
expensive = heapq.nlargest(2,key=lambda x: x['price'])
print('the two cheap stocks:',expensive)

这正是我所期望的输出

the two cheap stocks: [{'name': 'APPLE','price': 31.75}]
the two expensive stocks: [{'name': 'MICROSOFT',{'name': 'FACEBOOK','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','c': 91.1}{'a': 'MICROSOFT','c': 543.22}大吗?在您看来,不是(因为'c'值)。但是python解释器不知道您想使用'c'键来比较字典。这就是为什么需要key参数的原因:它表明必须使用哪些数据来比较列表中的两个元素。

在您的情况下,您要告诉heapq类使用与'price'键相关的值来比较堆的两个字典。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。