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 dict
assomiglia{'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 dict
assomiglia{'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 random
modulo, 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 popitem
puoi ottenere oggetti in un ordine arbitrario (ma non strettamente casuale) da esso.
Inoltre, tieni presente che popitem
rimuove la coppia chiave-valore dal dizionario, come indicato nei documenti .
popitem () è utile per iterare distruttivamente su un dizionario
next
non 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 keys
dizionario (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.sample
e random.choice
non può funzionare con iteratori. Devono conoscere la lunghezza della sequenza, che non può essere determinata da un iteratore.
random.sample
restituisce 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_keys
come q = selected_keys
dopo 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.choice
non è 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 .