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 dictolhares 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 dictolhares 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 randommó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 popitemvocê obtém itens em uma ordem arbitrária (mas não estritamente aleatória).
Lembre-se também de que popitemremove o par de valores-chave do dicionário, conforme indicado nos documentos .
popitem () é útil para iterar destrutivamente sobre um dicionário
nextnã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 keysdicioná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.samplee random.choicenã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.sampleretorna 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_keyscomo q = selected_keysdepois 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.choicenã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())).