¿Cómo puedo obtener un par aleatorio de a dict? Estoy haciendo un juego en el que debes adivinar la capital de un país y necesito preguntas para que aparezcan al azar.
El dictparece{'VENEZUELA':'CARACAS'}
¿Cómo puedo hacer esto?
¿Cómo puedo obtener un par aleatorio de a dict? Estoy haciendo un juego en el que debes adivinar la capital de un país y necesito preguntas para que aparezcan al azar.
El dictparece{'VENEZUELA':'CARACAS'}
¿Cómo puedo hacer esto?
Respuestas:
Una forma sería:
import random
d = {'VENEZUELA':'CARACAS', 'CANADA':'OTTAWA'}
random.choice(list(d.values()))
EDITAR : La pregunta se cambió un par de años después de la publicación original, y ahora pide un par, en lugar de un solo elemento. La línea final ahora debería ser:
country, capital = random.choice(list(d.items()))
d = {'VENEZUELA':'CARACAS', 'CANADA':'OTTAWA'}Jeje, +1 para el lavado de cerebro muy sutil ...
Escribí esto tratando de resolver el mismo problema:
https://github.com/robtandy/randomdict
Tiene O (1) acceso aleatorio a claves, valores y elementos.
Prueba esto:
import random
a = dict(....) # a is some dictionary
random_key = random.sample(a, 1)[0]
Esto definitivamente funciona.
Si no desea utilizar el randommódulo, también puede probar popitem () :
>> d = {'a': 1, 'b': 5, 'c': 7}
>>> d.popitem()
('a', 1)
>>> d
{'c': 7, 'b': 5}
>>> d.popitem()
('c', 7)
Como dict no conserva el orden , al usarlo popitemobtienes elementos en un orden arbitrario (pero no estrictamente aleatorio).
También tenga en cuenta que popitemelimina el par clave-valor del diccionario, como se indica en los documentos .
popitem () es útil para iterar destructivamente sobre un diccionario
nextno funciona con un diccionario, ya que es un mapeo. (Vine aquí en busca de inspiración y esto fue todo).
>>> import random
>>> d = dict(Venezuela = 1, Spain = 2, USA = 3, Italy = 4)
>>> random.choice(d.keys())
'Venezuela'
>>> random.choice(d.keys())
'USA'
Llamando a random.choice en el keysdiccionario (los países).
random.choice(list(d.keys())).
Si no quieres usar random.choice () puedes intentarlo de esta manera:
>>> 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(…)aquí varias veces. ¿Qué tal myDictionary_list = list(myDictionary)?
Como esto es tarea:
Vea random.sample()cuál seleccionará y devolverá un elemento aleatorio de una lista. Puede obtener una lista de claves de diccionario con dict.keys()y una lista de valores de diccionario con dict.values().
random.sampley random.choiceno puede trabajar con iteradores. Necesitan saber la longitud de la secuencia, que no se puede determinar a partir de un iterador.
random.sampledevuelve elementosk aleatorios , devuelve un único elemento aleatoriorandom.choice
Supongo que está haciendo una aplicación de tipo cuestionario. Para este tipo de aplicación, he escrito una función que es la siguiente:
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]))
Si voy a dar la entrada de questions = {'VENEZUELA':'CARACAS', 'CANADA':'TORONTO'}y llamar a la funciónshuffle(questions) entonces la salida será la siguiente:
¿VENEZUELA? CARACAS ¿CANADÁ? TORONTO
Puede ampliar esto aún más barajando las opciones también
selected_keys. Y probablemente repetirás eso unas 100 veces. Al menos elimine las claves tomadas de q like del(q[current_selection]): puede sobrescribir q con el nuevo aleatorio selected_keyscomo q = selected_keysdespués de todo. ¡Tampoco te olvides de identificarte! Alternativamente, mira mi np.random.choice(...)enfoque: stackoverflow.com/a/62843377/4575793
Prueba esto (usando random.choice de los elementos)
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 las versiones modernas de Python (desde 3), los objetos devueltos por métodos dict.keys(), dict.values()y dict.items()son objetos de vista *. Y bueno, se puede repetir, por random.choicelo que no es posible usarlo directamente , ya que ahora no son una lista o un conjunto.
Una opción es usar la comprensión de la lista para hacer el trabajo 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}')
Referencias
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)
Encontré esta publicación buscando una solución bastante comparable. Para seleccionar múltiples elementos de un dict, esto se puede usar:
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()hay una lista, pero no funcionará en Python 3.x donded.keys()hay un iterador. Deberías hacer en surandom.choice(list(d.keys()))lugar.