2016-01-10 28 views
8

Sagen wir mal ich dieses Wörterbuch haben:Auswahl Zufallswerte aus Wörterbuch

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

ich den Schlüssel, der größte Wert mit diesem Code hat:

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

es gibt 'c'

Aber ich möchte einen zufälligen Schlüssel aus den 3 größten Werten auswählen. Nach diesem Wörterbuch Top 3 sind:

c 
a 
d 

Es sollte zufällig einen Schlüssel aus ihnen auswählen. Wie kann ich das machen?

+1

Sie wollen also eine zufällige Auswahl aus einem Wörterbuch? Oder eine einzelne zufällige Auswahl aus einer bereits vorhandenen "Liste" der Top 3 Tasten? Oder möchten Sie die drei wichtigsten Tasten suchen und dann eine einzelne zufällige auswählen? – TigerhawkT3

+1

Ich hasse es, ein Wermutstropfen zu sein, aber diese Frage kann leicht beantwortet werden, indem man die Antworten von [Wie wähle ich zufällig ein Element aus einer Liste mit Python?] (Http://stackoverflow.com/q/306400/1394393) und [5 Maximalwerte in einem Python-Wörterbuch] (http://stackoverflow.com/q/7197315/1394393). Ich habe deswegen einen Downvot gefunden, weil das in meinem Buch einen geringen Forschungsaufwand bedeutet. Kannst du erklären, wie sich diese Frage von einem gemeinsamen Klopfen unterscheidet? – jpmc26

Antwort

13

Wenn Sie die Top-3-Tasten zu finden und dann bei einer der Schlüssel zufällig bekommen, dann würde ich empfehlen random.choice und collections.Counter mit, wie diese

>>> 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) werden die ersten drei Werte aus dem Wörterbuch bekommen basierend auf den Werten des Wörterbuchobjekts, das an sie übergeben wird, und dann wählen wir zufällig einen der zurückgegebenen Werte aus und geben nur den Schlüssel von ihm zurück.

+0

in Bezug auf Ihren früheren Kommentar zu meiner Antwort: Muß '' most_common' 'nicht auch etwas sortieren, so dass die Komplexität O (nlog (n)) für beide Lösungen ist? – timgeb

+0

Okay, danke für die Klarstellung. – timgeb

+0

Was ist mit [TigerhawkT3] (http://stackoverflow.com/questions/34707280/selecting-random-values-from-dictionary/34707349#34707349) Antwort? –

7

Holen Sie sich die Schlüssel mit den drei größten Werten.

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

Einer von ihnen zufällig auswählen:

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

sortieren das Wörterbuch nach Wert absteigend, erhalten die ersten drei Objekte aus dem resultierenden list, dann random.choice verwenden:

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

Und Nennen Sie es nicht dict oder Sie maskieren das eingebaute.

Verwandte Themen