2016-01-10 5 views
8

Скажем, у меня есть этот словарь:Выбор случайных значений из словаря

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

я получить ключ, который имеет наибольшее значение с этим кодом:

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

он возвращает 'c'

Но я хотите выбрать случайный ключ из трех верхних значений. Согласно этому словарю top 3:

c 
a 
d 

Он должен случайным образом выбирать из них ключ. Как я могу это сделать?

+1

Итак, вам нужен один случайный выбор из словаря? Или один случайный выбор из ранее существовавшего «списка» трех верхних ключей? Или вы хотите найти верхние 3 клавиши, а затем выбрать один случайный из них? – TigerhawkT3

+1

Ненавижу быть неудачником, но на этот вопрос легко ответить, объединив ответы из [Как я случайно выбираю элемент из списка с помощью Python?] (Http://stackoverflow.com/q/306400/1394393) и [5 максимальных значений в словаре python] (http://stackoverflow.com/q/7197315/1394393). Я проигнорировал результат, так как это составляет плохую исследовательскую работу в моей книге. Не могли бы вы объяснить, как этот вопрос отличает себя от того, чтобы просто шлепать этих двух вместе? – jpmc26

ответ

13

Если вы хотите, чтобы найти лучшие 3 кнопки, а затем получить одну из клавиш в случайном порядке, то я бы рекомендовал использовать random.choice и collections.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) получат первые три значения из словаря на основе значений передаваемого ему словарного объекта, а затем мы произвольно выбираем одно из возвращаемых значений и возвращаем только ключ из него.

+0

относительно вашего более раннего комментария к моему ответу: '' самому_команду' тоже не нужно делать какую-то сортировку, так что сложность O (nlog (n)) для обоих решений? – timgeb

+0

Хорошо, спасибо за разъяснение. – timgeb

+0

Как насчет [TigerhawkT3] (http://stackoverflow.com/questions/34707280/selecting-random-values-from-dictionary/34707349#34707349) ответа? –

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

Сортировать Словарь по убыванию значения, получить первые три объекта из полученного 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, или вы будете маскировать встроенный.