字典中查找最大值的基本方法

3

假设我有一个字典。我想找到值最高的4个键。我想以一种非常基本的方式来实现这个目标。我的计算机科学知识并不那么高级。我只想遍历这个字典。或者应该怎么做呢?我意识到这并不是很具有挑战性。我不想使用heapq。我应该如何实现呢?


最高值是什么意思?最大数字?最长长度? - Zizouz212
https://dev59.com/iUnSa4cB1Zd3GeqPQsPp - NYB
你在意最高值以什么顺序返回吗? - martineau
@martineau 我不在乎它们以什么顺序返回 - user4775839
@martineau 我只需要以最基本的方式完成它。 - user4775839
@Zizouz212 最大值,即具有最大整数值的键。 - user4775839
4个回答

3

我认为最符合Python风格的方式是:

sorted(d, key=d.get, reverse=True)[:4]

sorted(d, key=d.get)[-4:] 这样写会更短... - martineau
使用 d.get()O(n) 解决方案效率低。为什么不直接迭代项目呢?collection.Counter.most_common 中使用的解决方案是 sorted(self.items(), key=itemgetter(1), reverse=True) - JBernardo
@jwilner 我有点明白你的意思。你能给我展示一下那个修正案会是什么样子吗? - user4775839
@Beth,这与上面的解决方案略有不同。max_keys = sorted(d.keys(), key=d.get)[:-4] 或者你也可以反转 -- sorted(d.keys(), key=d.get, reverse=True)[:4]。我的更大的观点是人们忘记了 list(dict) == d.keys(),在这种情况下,我认为程序员应该倾向于更明确的选项。 - jwilner
1
@jwilner 这样做的问题在于它会浪费 Python 2.x 的内存,不必要地复制一个列表,而这个列表最终会被垃圾回收。字典无论如何都会遍历键,这应该是常见的 Python 知识。 - wim
显示剩余5条评论

1
您应该使用 collections.Counter 对象。
c = collections.Counter(original_dict)
c.most_common(4)

如果你只想要钥匙,那么:

[k for k, v in c.most_common(4)]

如需了解其实现方式,请查看此处的源代码。


@Shashank,你可以使用Counter来计数任何东西。尝试自己编写代码。这样做更加简洁。 - JBernardo
成功了,它可以正常运行 :) - Shashank
好技巧!它在后台使用了heapq。 - wim

0

按值排序,然后切片。 sorted 函数需要一个键函数。

items_by_value = sorted(d.items(), key=lambda (k, v): v) 
keys = [k for k, v in items_by_value[-4:]]

0

好问题。

假设 d 是字典,如果您不关心键的顺序,您可以使用以下代码:

keys = [v[0] for v in sorted(d.items(), key=lambda v: v[1])[-4:]]

对于大型字典,最好使用以下方法以提高效率:

keys = [v[0] for v in sorted(d.items(), key=operator.itemgetter(1))[-4:]]

[-4:] 表示最后四个条目。在这两种情况下,如果您希望键按其相应的最高值的顺序排列,则请改用 [-1:-5:-1],这是最后四个输入的反向顺序。


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