【问题标题】:Selecting random values from dictionary从字典中选择随机值
【发布时间】:2016-04-14 22:05:36
【问题描述】:

假设我有这本字典:

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

我得到了这段代码最有价值的密钥:

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

它返回'c'

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

c
a
d

它应该从它们中随机选择一个键。我该怎么做?

【问题讨论】:

  • 那么,您想从字典中随机选择一个吗?还是从前 3 个键的现有 list 中随机选择一个?或者您想找到前 3 个键,然后从中随机选择一个?
  • 我不想成为一个沮丧的人,但是结合How do I randomly select an item from a list using Python?5 maximum values in a python dictionary的答案很容易回答这个问题。结果我投了反对票,因为这在我的书中构成了糟糕的研究工作。你能解释一下这个问题与将这两者放在一起的区别吗?

标签: python dictionary random


【解决方案1】:

如果你想找到前 3 个键,然后随机获取其中一个键,那么我建议使用 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))?
  • TigerhawkT3 的回答呢?
  • @IronFist 这也具有相同的 O(nlogn) 复杂度。
  • 只选择 3 个元素 most_common 应该更接近线性时间 stackoverflow.com/questions/29240807/…
【解决方案2】:

获取三个最大值的键。

>>> 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'

【讨论】:

    【解决方案3】:

    按值降序对字典进行排序,从结果list中获取前三个对象,然后使用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,否则你会掩盖内置的。

    【讨论】:

      猜你喜欢
      • 2017-03-30
      • 1970-01-01
      • 2020-04-06
      • 2015-01-09
      • 1970-01-01
      • 2015-05-25
      • 2020-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多