¿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 dict
parece{'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 dict
parece{'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 random
mó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 popitem
obtienes elementos en un orden arbitrario (pero no estrictamente aleatorio).
También tenga en cuenta que popitem
elimina el par clave-valor del diccionario, como se indica en los documentos .
popitem () es útil para iterar destructivamente sobre un diccionario
next
no 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 keys
diccionario (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.sample
y random.choice
no puede trabajar con iteradores. Necesitan saber la longitud de la secuencia, que no se puede determinar a partir de un iterador.
random.sample
devuelve 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_keys
como q = selected_keys
despué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.choice
lo 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.