Como posso obter um par aleatório de a dict
? Estou criando um jogo em que você precisa adivinhar a capital de um país e preciso que as perguntas apareçam aleatoriamente.
Os dict
olhares como{'VENEZUELA':'CARACAS'}
Como posso fazer isso?
Como posso obter um par aleatório de a dict
? Estou criando um jogo em que você precisa adivinhar a capital de um país e preciso que as perguntas apareçam aleatoriamente.
Os dict
olhares como{'VENEZUELA':'CARACAS'}
Como posso fazer isso?
Respostas:
Uma maneira seria:
import random
d = {'VENEZUELA':'CARACAS', 'CANADA':'OTTAWA'}
random.choice(list(d.values()))
EDIT : A pergunta foi alterada alguns anos após a postagem original e agora pede um par, em vez de um único item. A linha final agora deve ser:
country, capital = random.choice(list(d.items()))
d = {'VENEZUELA':'CARACAS', 'CANADA':'OTTAWA'}
Hehe, +1 para a lavagem cerebral muito sutil ...
Eu escrevi isso tentando resolver o mesmo problema:
https://github.com/robtandy/randomdict
Possui acesso aleatório O (1) a chaves, valores e itens.
Tente o seguinte:
import random
a = dict(....) # a is some dictionary
random_key = random.sample(a, 1)[0]
Isso definitivamente funciona.
Se você não quiser usar o random
módulo, também pode tentar popitem () :
>> d = {'a': 1, 'b': 5, 'c': 7}
>>> d.popitem()
('a', 1)
>>> d
{'c': 7, 'b': 5}
>>> d.popitem()
('c', 7)
Como a dict
ordem não preserva , usando popitem
você obtém itens em uma ordem arbitrária (mas não estritamente aleatória).
Lembre-se também de que popitem
remove o par de valores-chave do dicionário, conforme indicado nos documentos .
popitem () é útil para iterar destrutivamente sobre um dicionário
next
não funciona com um dicionário, pois é um mapeamento. (Eu vim aqui para inspiração e foi isso).
>>> import random
>>> d = dict(Venezuela = 1, Spain = 2, USA = 3, Italy = 4)
>>> random.choice(d.keys())
'Venezuela'
>>> random.choice(d.keys())
'USA'
Chamando random.choice no keys
dicionário (os países).
random.choice(list(d.keys()))
.
Se você não quiser usar o random.choice (), tente o seguinte:
>>> 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(…)
aqui várias vezes. Que tal myDictionary_list = list(myDictionary)
?
Como isso é lição de casa:
Confira o random.sample()
que selecionará e retornará um elemento aleatório de uma lista. Você pode obter uma lista de chaves de dicionário com dict.keys()
e uma lista de valores de dicionário com dict.values()
.
random.sample
e random.choice
não pode trabalhar com iteradores. Eles precisam saber o comprimento da sequência, que não pode ser determinado a partir de um iterador.
random.sample
retorna elementosk
aleatórios , retorna um único elemento aleatóriorandom.choice
Estou assumindo que você está fazendo um tipo de aplicativo de teste. Para esse tipo de aplicativo, escrevi uma função que é a seguinte:
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 eu vou dar a entrada questions = {'VENEZUELA':'CARACAS', 'CANADA':'TORONTO'}
e chamar a funçãoshuffle(questions)
a saída será a seguinte:
VENEZUELA? CARACAS CANADÁ? TORONTO
Você pode estender ainda mais isso misturando as opções também
selected_keys
. E você provavelmente repetirá isso cerca de 100 vezes. Pelo menos apague as teclas capturadas de q like del(q[current_selection])
- você pode sobrescrever q com o novo shuffled selected_keys
como q = selected_keys
depois de tudo. Também não se esqueça de identificar! Como alternativa, observe minha np.random.choice(...)
abordagem: stackoverflow.com/a/62843377/4575793
Tente isso (usando random.choice dos itens)
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'
Com versões modernas de Python (desde 3), a objetos retornados por métodos dict.keys()
, dict.values()
e dict.items()
são vista objetos *. E ei, pode ser iterado, portanto, o uso direto random.choice
não é possível, pois agora eles não são uma lista ou conjunto.
Uma opção é usar a compreensão da lista para fazer o trabalho com 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}')
Referências:
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)
Encontrei este post procurando uma solução comparável. Para escolher vários elementos de um dict, isso pode ser usado:
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()
há uma lista, mas não funcionará no Python 3.x, onded.keys()
é um iterador. Você deveria fazer issorandom.choice(list(d.keys()))
.