2016-01-10 10 views
8

Diciamo che ho questo dizionario:Selezione dei valori casuali da dizionario

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

ho la chiave che ha maggior valore con questo codice:

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

restituisce 'c'

Ma io vuoi selezionare una chiave casuale tra i 3 migliori valori. Secondo questo dizionario i primi 3 sono:

c 
a 
d 

Dovrebbe selezionare a caso una chiave da loro. Come lo posso fare?

+1

Quindi, vuoi una singola selezione casuale da un dizionario? O una singola selezione casuale da una lista preesistente dei primi 3 tasti? O vuoi trovare i primi 3 tasti, e poi selezionarne uno a caso? – TigerhawkT3

+1

Odio essere un downer, ma questa domanda è facilmente risolvibile combinando le risposte di [Come faccio a selezionare casualmente un elemento da un elenco usando Python?] (Http://stackoverflow.com/q/306400/1394393) e [5 valori massimi in un dizionario python] (http://stackoverflow.com/q/7197315/1394393). Ne ho ridiscusso di conseguenza, dal momento che ciò costituisce uno scarso sforzo di ricerca nel mio libro. Potresti spiegare come questa domanda si distingua dal semplice schiaffo di quei due insieme? – jpmc26

risposta

13

Se si desidera trovare i 3 tasti superiori e quindi ottenere uno dei tasti a caso, poi mi consiglia di utilizzare random.choice e collections.Counter, come questo

>>> 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) otterrà i primi tre valori dal dizionario in base ai valori dell'oggetto dizionario passato ad esso e quindi selezioniamo a caso uno dei valori restituiti e restituiamo solo la chiave da esso.

+0

per quanto riguarda il tuo precedente commento sulla mia risposta: 'most_common' non deve fare anche qualche ordinamento, tale che la complessità è O (nlog (n)) per entrambe le soluzioni? – timgeb

+0

Ok, grazie per i chiarimenti. – timgeb

+0

Che dire della risposta [TigerhawkT3] (http://stackoverflow.com/questions/34707280/selecting-random-values-from-dictionary/34707349#34707349)? –

7

Ottieni le chiavi con i tre valori più grandi.

>>> import heapq 
>>> d = {'a': 100, 'b': 5, 'c': 150, 'd': 60} 
>>> largest = heapq.nlargest(3, d, key=d.__getitem__) 
>>> largest 
['c', 'a', 'd'] 

Quindi selezionare uno di loro in modo casuale:

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

Ordina il dizionario per valore decrescente, ottenere i primi tre oggetti dalla risultante list, quindi utilizzare random.choice:

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

E non chiamarlo dict o maschererai il built-in.

Problemi correlati