So erhalten Sie einen zufälligen Wert aus dem Wörterbuch in Python

148

Wie kann ich ein zufälliges Paar von einem bekommen dict? Ich mache ein Spiel, in dem Sie eine Hauptstadt eines Landes erraten müssen und ich brauche Fragen, um zufällig zu erscheinen.

Das dictsieht aus wie{'VENEZUELA':'CARACAS'}

Wie kann ich das machen?

Tekknolagi
quelle

Antworten:

259

Ein Weg wäre:

import random
d = {'VENEZUELA':'CARACAS', 'CANADA':'OTTAWA'}
random.choice(list(d.values()))

BEARBEITEN : Die Frage wurde ein paar Jahre nach dem ursprünglichen Beitrag geändert und fragt nun nach einem Paar anstatt nach einem einzelnen Element. Die letzte Zeile sollte jetzt sein:

country, capital = random.choice(list(d.items()))
Gerrat
quelle
141
Das funktioniert in Python 2.x, wo d.keys()sich eine Liste befindet, aber in Python 3.x, wo d.keys()sich ein Iterator befindet, funktioniert es nicht . Sie sollten random.choice(list(d.keys()))stattdessen tun .
Duncan
21
@ Duncan: Ich kann es kaum erwarten, bis alle Bibliotheken von Drittanbietern Python 3.x-kompatibel sind, sodass die Python-Fragen nicht für jede Frage zwei Antworten benötigen.
Gerrat
9
Äh, wie wäre es mit: d = {'VENEZUELA':'CARACAS', 'CANADA':'OTTAWA'}Hehe, +1 für die sehr subtile Gehirnwäsche ...
Gentimouton
4
@gentimouton ... interessant, aber vielleicht wollte ich nur die bevölkerungsreichste Stadt in jedem Land - nicht die Hauptstädte :)
Gerrat
12
Ist das effizient? Ist diese Skala, wenn das Diktat wirklich groß wird?
Spectral
26

Ich habe dies geschrieben, um das gleiche Problem zu lösen:

https://github.com/robtandy/randomdict

Es hat O (1) zufälligen Zugriff auf Schlüssel, Werte und Elemente.

Rob T.
quelle
19
Es ist nicht O (1), um Ihre tatsächliche Antwort zu finden
Berry Tsakala
14

Versuche dies:

import random
a = dict(....) # a is some dictionary
random_key = random.sample(a, 1)[0]

Das funktioniert definitiv.

lavee_singh
quelle
12

Wenn Sie das randomModul nicht verwenden möchten , können Sie auch popitem () ausprobieren :

>> d = {'a': 1, 'b': 5, 'c': 7}
>>> d.popitem()
('a', 1)
>>> d
{'c': 7, 'b': 5}
>>> d.popitem()
('c', 7)

Da die dict Reihenfolge nicht erhalten bleibt, erhaltenpopitem Sie durch die Verwendung von Elementen in einer beliebigen (aber nicht streng zufälligen) Reihenfolge.

Beachten Sie auch, dass popitemdas Schlüssel-Wert-Paar aus dem Wörterbuch entfernt wird, wie in den Dokumenten angegeben .

popitem () ist nützlich, um ein Wörterbuch destruktiv zu durchlaufen

patriciasz
quelle
29
Das ist irgendwie schlecht, denn wenn Sie das Wörterbuch in derselben Reihenfolge auf dieselbe Python-Version laden, erhalten Sie mit ziemlicher Sicherheit dasselbe Element.
Alex
Siehe auch: stackoverflow.com/questions/10593651/…
Ciro Santilli 法轮功 冠状 病 六四 事件 法轮功
31
Python 3.6 Dikt ist tatsächlich bestellt ! Das ist super wichtig
oder Duan
7
Diese Antwort ist einfach falsch. Noch vor 3.6 erhalten Sie keinen zufälligen Wert, sondern einen Wert, der vom Hash-Wert des Elements abhängt.
OBu
1
Wenn Sie die Inkongruenz mit der Anforderung des OP ignorieren, können Sie auf diese Weise die Tatsache nextüberwinden , dass ein Wörterbuch nicht funktioniert, da es sich um eine Zuordnung handelt. (Ich kam hierher, um mich inspirieren zu lassen, und das war es).
Matteo Ferla
9
>>> import random
>>> d = dict(Venezuela = 1, Spain = 2, USA = 3, Italy = 4)
>>> random.choice(d.keys())
'Venezuela'
>>> random.choice(d.keys())
'USA'

Durch den Aufruf random.choice auf die keysdes Wörterbuchs (die Länder).

user225312
quelle
2
Hallo, ich versuche, mit Ihrer Methode zufällig einen Schlüssel aus einem bestimmten Wörterbuch auszuwählen, aber es funktioniert nicht. Mein Wörterbuch sieht aus wie a = {'walk': 20, 'run': 80} und wenn ich random.choice (a.keys ()) verwende, gibt es einen Fehler wie "dict_keys 'Objekt unterstützt keine Indizierung". Weißt du was los ist? Vielen Dank!!!
Beepretty
7
@beepretty dict.keys () gibt ein iterierbares Objekt zurück, kein listenähnliches Objekt. Verwenden Sie, um den Fehler zu beheben random.choice(list(d.keys())).
Greenstick
3
Verwenden Sie stattdessen random.sample, was billiger ist als das Kopieren der Schlüssel in eine Liste.
Steveayre
7

Dies funktioniert in Python 2 und Python 3:

Ein zufälliger Schlüssel:

random.choice(list(d.keys()))

Ein zufälliger Wert

random.choice(list(d.values()))

Ein zufälliger Schlüssel und Wert

random.choice(list(d.items()))
Firelynx
quelle
4

Wenn Sie random.choice () nicht verwenden möchten, können Sie Folgendes versuchen:

>>> list(myDictionary)[i]
'VENEZUELA'
>>> myDictionary = {'VENEZUELA':'CARACAS', 'IRAN' : 'TEHRAN'}
>>> import random
>>> i = random.randint(0, len(myDictionary) - 1)
>>> myDictionary[list(myDictionary)[i]]
'TEHRAN'
>>> list(myDictionary)[i]
'IRAN'
Milad Mohammad Rezaei
quelle
Achtung: Sie generieren list(…)hier mehrfach ein. Wie wäre es myDictionary_list = list(myDictionary)?
Cadoiz
4

Da der ursprüngliche Beitrag das Paar wollte :

import random
d = {'VENEZUELA':'CARACAS', 'CANADA':'TORONTO'}
country, capital = random.choice(list(d.items()))

(Python 3-Stil)

OBu
quelle
3

Da dies Hausaufgaben sind:

Überprüfen Sie, random.sample()welches Element ein zufälliges Element aus einer Liste auswählt und zurückgibt. Sie können eine Liste der Wörterbuchschlüssel mit dict.keys()und eine Liste der Wörterbuchwerte mit erhalten dict.values().

Carl
quelle
5
random.sampleund random.choicekann nicht mit Iteratoren arbeiten. Sie müssen die Länge der Sequenz kennen, die von einem Iterator nicht bestimmt werden kann.
AFoglia
10
Nein, das sind KEINE Hausaufgaben. Ich schreibe es, um mir mit Spanisch zu helfen.
Tekknolagi
3
random.samplegibt kzufällige Elemente zurück , random.choicegibt ein einzelnes zufälliges Element zurück
Anentropic
Ja ... niemals cool anzunehmen, dass dies ein Hausaufgabenproblem ist. Was bedeutet das für die Community?
Jvriesem
3

Ich gehe davon aus, dass Sie eine Art Quizantrag stellen. Für diese Art von Anwendung habe ich eine Funktion geschrieben, die wie folgt lautet:

def shuffle(q):
"""
The input of the function will 
be the dictionary of the question
and answers. The output will
be a random question with answer
"""
selected_keys = []
i = 0
while i < len(q):
    current_selection = random.choice(q.keys())
    if current_selection not in selected_keys:
        selected_keys.append(current_selection)
        i = i+1
        print(current_selection+'? '+str(q[current_selection]))

Wenn ich die Eingabe von gebe questions = {'VENEZUELA':'CARACAS', 'CANADA':'TORONTO'}und die Funktion shuffle(questions)aufrufe, dann ist die Ausgabe wie folgt:

VENEZUELA? CARACAS
KANADA? TORONTO

Sie können dies weiter ausbauen, indem Sie auch die Optionen mischen

Anivarth
quelle
Sie sollten das Zeichnen nicht ersatzlos so programmieren. Stellen Sie sich vor, Sie zeichnen das 100. von 100 Elementen - 99% Chance, ein Element innerhalb von zu treffen selected_keys. Und Sie werden das wahrscheinlich ungefähr 100 Mal wiederholen. Löschen Sie zumindest die übernommenen Schlüssel von q like del(q[current_selection])- Sie können q mit dem neuen gemischt selected_keyswie q = selected_keysnach allem überschreiben . Vergessen Sie auch nicht die Identifizierung! Alternativ können Sie sich meinen np.random.choice(...)Ansatz ansehen
Cadoiz
1

Versuchen Sie dies (mit random.choice von Elementen)

import random

a={ "str" : "sda" , "number" : 123, 55 : "num"}
random.choice(list(a.items()))
#  ('str', 'sda')
random.choice(list(a.items()))[1] # getting a value
#  'num'
Herman Yanush
quelle
1

Mit modernen Versionen von Python (seit 3), Objekten , die von Methoden zurückgegeben dict.keys(), dict.values()und dict.items()sind Ansicht * Objekte. Und hey kann iteriert werden, so dass eine direkte Verwendung random.choicenicht möglich ist, da es sich jetzt nicht um eine Liste oder einen Satz handelt.

Eine Möglichkeit besteht darin, das Listenverständnis zu verwenden, um die Arbeit zu erledigen mit random.choice:

import random

colors = {
    'purple': '#7A4198',
    'turquoise':'#9ACBC9',
    'orange': '#EF5C35',
    'blue': '#19457D',
    'green': '#5AF9B5',
    'red': ' #E04160',
    'yellow': '#F9F985'
}

color=random.choice([hex_color for color_value in colors.values()]

print(f'The new color is: {color}')

Verweise:

Israel Z. DelaMora
quelle
0
b = { 'video':0, 'music':23,"picture":12 } 
random.choice(tuple(b.items())) ('music', 23) 
random.choice(tuple(b.items())) ('music', 23) 
random.choice(tuple(b.items())) ('picture', 12) 
random.choice(tuple(b.items())) ('video', 0) 
ziya efkar
quelle
2
Willkommen bei Stack Overflow! Vielen Dank für dieses Code-Snippet, das möglicherweise nur begrenzte kurzfristige Hilfe bietet. Eine richtige Erklärung würde ihren langfristigen Wert erheblich verbessern, indem sie zeigt, warum dies eine gute Lösung für das Problem ist, und es für zukünftige Leser mit anderen, ähnlichen Fragen nützlicher machen. Bitte bearbeiten Sie Ihre Antwort, um eine Erklärung hinzuzufügen, einschließlich der von Ihnen getroffenen Annahmen.
Toby Speight
0

Ich habe diesen Beitrag gefunden, indem ich nach einer vergleichbaren Lösung gesucht habe. Zum Auswählen mehrerer Elemente aus einem Diktat kann Folgendes verwendet werden:

idx_picks = np.random.choice(len(d), num_of_picks, replace=False) #(Don't pick the same element twice)
result = dict ()
c_keys = [d.keys()] #not so efficient - unfortunately .keys() returns a non-indexable object because dicts are unordered
for i in idx_picks:
    result[c_keys[i]] = d[i]
Cadoiz
quelle