从字典中找到n个最大的值

3
我正在使用Python项目工作,我有一个问题,如下所述,但是数据不同。 例如,如果我有这个字典:
fruitsCount= {"apple": 24, "orange": 20, "banana":18, "grape":13, "kiwi": 13}

如何返回具有最大值的键?如果我想返回三个最大值呢?
我使用了heapq.nlargest(3, fruitCount.values),但我不知道如何将它们与它们的键一起返回。
注意:fruitsCount是在使用另一个字典的Counter()之后返回的字典。
输出应该是相同的fruitsCount字典,其中包含n个最大值fruitsCount.values

2
nlargest()是什么?也许是heapq.nlargest()吗? - Martijn Pieters
1
是的,heapq.nlargest() - Nujud Ali
4个回答

6
您需要在items上使用heapq.nlargest(),并使用key参数告诉它从那个对中获取值:
heapq.nlargest(3, fruitCount.items(), key=lambda i: i[1])

这将返回三个最大的 (key, value) 对。

或者你可以直接使用 collections.Counter() 类,它有一个 most_common() 方法可以为你完成此操作:

Counter(fruitCount).most_common(3)

你可能想用调用dict()的语句包装上述建议以生成所需的字典。 - mhawke

2

我从未使用过heapq模块,因此更喜欢这种无需模块的方法:

sorted( fruitsCount.items(), key=lambda pair: pair[1], reverse=True )[:3]

更简洁但不太清晰:

sorted( fruitsCount.items(), key=lambda pair: -pair[1] )[:3]


我在我的问题中指的是 heapq 中的 nlargest()。 - Nujud Ali
heapq 模块的意义在于它是一种更有效率的算法,可用于选出 N 个最大的项目,其中 N < 总项目数。 - Martijn Pieters
4
我不认为这个"踩"(downvote)是必要的。说我想要解决问题而不使用库函数是完全公平的。在这个限制条件下,所提供的答案是很好的。 - Iron Pillow

1
你可以尝试这个。你的答案将会是苹果,橘子和香蕉。
heapq.nlargest(3, d, key=fruitsCount.get)

这种方法的时间复杂度为nlog(t)。其中,n是字典中元素的数量,t是所需元素的数量。在上面的例子中,t等于3。


0

我是Python新手,对于快捷方式不是很确定,但这是我的答案:

from heapq import nlargest

fruitsCount= {"apple": 24, "orange": 20, "banana":18, "grape":13, "kiwi": 13}

将键值对反转,以便根据值进行排序:

fruitsCount = {j:i for i,j in fruitsCount.items()}

在一个单独的字典中找到前三个最大的项:

x = dict(nlargest(3,fruitsCount.items()))

将字典反转回原始形式:

x = {z:y for y,z in x.items()}
print(x)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接