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?

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()))

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


14

Versuche dies:

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

Das funktioniert definitiv.


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


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


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).


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()))

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'

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)


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().


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


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'

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:


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) 

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]
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.