从字典中选择随机值

8

假设我有这个字典:

dict = {'a': 100, 'b': 5, 'c': 150, 'd': 60};

使用以下代码获取具有最大值的密钥:

most_similar = max(dic.iteritems(), key=operator.itemgetter(1))[0]

它返回'c'

但我想从前三个最大值中随机选择一个键。根据这个字典,前三个最大值是:

c
a
d

它应该从它们中随机选择一个键。我该如何做到这一点?

1
所以,你想要从字典中随机选择一个元素吗?还是从预先存在的前三个键的“列表”中随机选择一个元素?或者你想找到前三个键,然后从它们中随机选择一个元素? - TigerhawkT3
1
我不想泼冷水,但这个问题可以通过结合如何使用Python从列表中随机选择项目?Python字典中的5个最大值的答案轻松回答。由于这构成了我看来的研究不足,因此我已经投票反对。您能解释一下这个问题与将这两个问题组合在一起有何不同吗? - jpmc26
3个回答

13

如果您想找到前三个键,然后随机获取其中一个键,则建议使用 random.choicecollections.Counter,代码如下:

>>> d = {'a': 100, 'b': 5, 'c': 150, 'd': 60}
>>> from collections import Counter
>>> from random import choice
>>> choice(Counter(d).most_common(3))[0]
'c'

Counter(d).most_common(3)将基于传递给它的字典对象的值获取前三个最大值,然后我们随机选择其中一个返回值并仅返回其键。


关于您之前对我的回答的评论:most_common 不也需要进行一些排序,使得两种解决方案的复杂度都是 O(nlog(n)) 吗? - timgeb
TigerhawkT3的回答怎么样? - Iron Fist
@IronFist 这个算法的时间复杂度也是O(nlogn)。 - thefourtheye
2
对于选择仅有的3个元素,“most_common”应该更接近于线性时间。 - Akavall

7
获取三个最大值对应的键。
>>> import heapq
>>> d = {'a': 100, 'b': 5, 'c': 150, 'd': 60}
>>> largest = heapq.nlargest(3, d, key=d.__getitem__)
>>> largest
['c', 'a', 'd']

然后随机选择其中一个:

>>> import random
>>> random.choice(largest)
'c'

4

将字典按值的降序排序,从结果列表中获取前三个对象,然后使用random.choice

>>> import random
>>> d = {'a': 100, 'b': 5, 'c': 150, 'd': 60}
>>> random.choice(sorted(d, reverse=True, key=d.get)[:3])
'c'

不要称其为dict,否则会掩盖内置的内容。

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