Come posso ottenere una coppia casuale da un dict? Sto realizzando un gioco in cui devi indovinare una capitale di un paese e ho bisogno che le domande appaiano casualmente.
Gli dictassomiglia{'VENEZUELA':'CARACAS'}
Come posso fare questo?
Come posso ottenere una coppia casuale da un dict? Sto realizzando un gioco in cui devi indovinare una capitale di un paese e ho bisogno che le domande appaiano casualmente.
Gli dictassomiglia{'VENEZUELA':'CARACAS'}
Come posso fare questo?
Risposte:
Un modo sarebbe:
import random
d = {'VENEZUELA':'CARACAS', 'CANADA':'OTTAWA'}
random.choice(list(d.values()))
EDIT : la domanda è stata cambiata un paio di anni dopo il post originale, e ora chiede una coppia, piuttosto che un singolo elemento. L'ultima riga dovrebbe ora essere:
country, capital = random.choice(list(d.items()))
d = {'VENEZUELA':'CARACAS', 'CANADA':'OTTAWA'}Hehe, +1 per il lavaggio del cervello molto sottile ...
Ho scritto questo cercando di risolvere lo stesso problema:
https://github.com/robtandy/randomdict
Ha O (1) accesso casuale a chiavi, valori ed elementi.
Prova questo:
import random
a = dict(....) # a is some dictionary
random_key = random.sample(a, 1)[0]
Questo sicuramente funziona.
Se non vuoi usare il randommodulo, puoi anche provare popitem () :
>> d = {'a': 1, 'b': 5, 'c': 7}
>>> d.popitem()
('a', 1)
>>> d
{'c': 7, 'b': 5}
>>> d.popitem()
('c', 7)
Dal momento dict che non preserva l'ordine , usando popitempuoi ottenere oggetti in un ordine arbitrario (ma non strettamente casuale) da esso.
Inoltre, tieni presente che popitemrimuove la coppia chiave-valore dal dizionario, come indicato nei documenti .
popitem () è utile per iterare distruttivamente su un dizionario
nextnon funziona con un dizionario in quanto è una mappatura. (Sono venuto qui per l'ispirazione e questo è stato).
>>> import random
>>> d = dict(Venezuela = 1, Spain = 2, USA = 3, Italy = 4)
>>> random.choice(d.keys())
'Venezuela'
>>> random.choice(d.keys())
'USA'
Chiamando random.choice sul keysdizionario (i paesi).
random.choice(list(d.keys())).
Se non vuoi usare random.choice () puoi provare in questo modo:
>>> 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'
list(…)qui più volte. Che ne dici myDictionary_list = list(myDictionary)?
Dal momento che si tratta di compiti a casa:
Scopri random.sample()quale selezionerà e restituirà un elemento casuale da un elenco. È possibile ottenere un elenco di chiavi del dizionario con dict.keys()e un elenco di valori del dizionario con dict.values().
random.samplee random.choicenon può funzionare con iteratori. Devono conoscere la lunghezza della sequenza, che non può essere determinata da un iteratore.
random.samplerestituisce elementik casuali , restituisce un singolo elemento casualerandom.choice
Presumo che tu stia facendo un quiz tipo di domanda. Per questo tipo di applicazione ho scritto una funzione che è la seguente:
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]))
Se darò l'input di questions = {'VENEZUELA':'CARACAS', 'CANADA':'TORONTO'}e chiamerò la funzioneshuffle(questions) Quindi l'output sarà il seguente:
VENEZUELA? CARACAS CANADA? TORONTO
Puoi estenderlo ulteriormente mescolando anche le opzioni
selected_keys. E probabilmente lo ripeterai circa 100 volte. Almeno cancella i tasti presi di q like del(q[current_selection])- puoi sovrascrivere q con il nuovo mischiato selected_keyscome q = selected_keysdopo tutto. Inoltre, non dimenticare di identificarti! In alternativa guardare il mio np.random.choice(...)approccio: stackoverflow.com/a/62843377/4575793
Prova questo (usando random.choice dagli articoli)
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'
Con le versioni moderne di Python (dal 3), gli oggetti restituiti con metodi dict.keys(), dict.values()e dict.items()sono oggetti vista *. Ehi possono essere ripetuti, quindi l'uso diretto random.choicenon è possibile in quanto ora non sono un elenco o un set.
Un'opzione è utilizzare la comprensione dell'elenco per eseguire il lavoro con 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}')
Riferimenti:
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)
Ho trovato questo post cercando una soluzione piuttosto comparabile. Per selezionare più elementi da un dict, questo può essere usato:
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]
d.keys()è un elenco, ma non funzionerà in Python 3.x doved.keys()è un iteratore. Dovrestirandom.choice(list(d.keys()))invece fare .