teknolagi
En Python, dado un diccionario como
{
'VENEZUELA': 'CARACAS',
'CANADA': 'OTTAWA'
}
¿Cómo puedo elegir un aleatorio elemento (par clave-valor)?
¿Qué sucede si solo necesito la clave o solo el valor? ¿Se puede optimizar?
Gerrat
Haga una lista de los elementos del diccionario y elija al azar de la forma habitual:
import random
d = {'VENEZUELA':'CARACAS', 'CANADA':'OTTAWA'}
country, capital = random.choice(list(d.items()))
De manera similar, si solo se necesita un valor, elija directamente de los valores:
capital = random.choice(list(d.values()))
-
Para ampliar el comentario de Duncan, también puedes simplemente hacer
random.choice([d.keys()])
. Los corchetes convierten el iterador en una lista de la misma manera que llamarlist()
pero puede parecer un poco más limpio para algunos.– Seaux
14 de julio de 2015 a las 15:48
-
¿Es esto eficiente? ¿Esta escala si dict se vuelve realmente grande?
– usuario2558887
25 de julio de 2015 a las 19:11
-
@code-法: Depende de lo que quieras decir con eficientey grande. Una prueba rápida muestra que puede seleccionar un millón de valores aleatorios de un diccionario con un millón de entradas en menos de un segundo (suponiendo que guarde el
d.keys()
parte). ¿Es eso eficiente?– Gerrat
11/08/2015 a las 20:44
-
@toto_tico: Cambiar un iterador a una lista sería O(n)
– Gerrat
21/09/2015 a las 15:30
-
@Seaux: los corchetes solo hacen una lista de un elemento cuyo elemento es el propio iterador. No hacen una lista cuyos elementos son los elementos del iterador.
–Bruno Le Floch
7 dic 2016 a las 14:43
patriciasz
Si no desea utilizar el random
módulo, también puedes probar elemento pop():
>> d = {'a': 1, 'b': 5, 'c': 7}
>>> d.popitem()
('a', 1)
>>> d
{'c': 7, 'b': 5}
>>> d.popitem()
('c', 7)
Desde el dict
no conserva el orden, al usar popitem
obtiene 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 el documentos.
popitem() es útil para iterar destructivamente sobre un diccionario
-
Esto es un poco malo, porque si carga el diccionario en el mismo orden en la misma versión de python, es casi seguro que obtendrá el mismo elemento.
– Alex
22 mayo 2014 a las 17:43
-
Ver también: stackoverflow.com/questions/10593651/…
– Ciro Santilli OurBigBook.com
11 de noviembre de 2016 a las 11:01
-
python 3.6 dict es en realidad ORDENADO! esto es muy importante
– O Duan
30 de enero de 2017 a las 16:01
-
Esta respuesta es simplemente incorrecta. Incluso antes de 3.6, esto no le dará un valor aleatorio, sino un valor que depende del valor hash del elemento.
– OBu
25 de junio de 2018 a las 20:27
-
Ignorando la incongruencia con la solicitud del OP, de esta manera es una buena manera de superar el hecho de que
next
no funciona con un diccionario ya que es un mapeo. (Vine aquí en busca de inspiración y esto fue todo).– Matteo Ferla
13 de noviembre de 2018 a las 10:19
lavee_singh
dar un diccionario a
usar:
import random
random_key = random.sample(a.keys(), 1)[0]
-
TypeError: Population must be a sequence or set. For dicts, use list(d).
– Wim
29 de octubre de 2020 a las 6:21
-
random_key = random.sample(a.keys(), 1)[0]
funciona, sin embargo.– dlowe
10 de septiembre de 2021 a las 12:02
-
@wim No puedo verificar fácilmente en este momento, pero creo que funcionó con solo
a
en 2.x. (Además, es un poco desconcertante que el mensaje de excepción codifique un nombre de variable que no está presente en el código).– Karl Knechtel
17 de marzo a las 6:13
usuario225312
Llamar elección aleatoria sobre las claves del diccionario (los países).
En 2.x, el keys
se puede elegir directamente:
>>> import random
>>> d = dict(Venezuela = 1, Spain = 2, USA = 3, Italy = 4)
>>> random.choice(d.keys())
'Venezuela'
>>> random.choice(d.keys())
'USA'
En 3.x, cree primero una lista, por ejemplo random.choice(list(d.keys()))
.
Esto funciona en Python 2 y Python 3:
Una clave aleatoria:
random.choice(list(d.keys()))
Un valor aleatorio
random.choice(list(d.values()))
Una clave aleatoria y un valor
random.choice(list(d.items()))
OBu
Dado que la publicación original quería el par:
import random
d = {'VENEZUELA':'CARACAS', 'CANADA':'TORONTO'}
country, capital = random.choice(list(d.items()))
(estilo Python 3)
Carlos Knechtel
Para obtener una clave aleatoria, utilice random.choice()
pasando las claves del diccionario así:
import random
keys = list(my_dict)
country = random.choice(keys)