¿Cómo puedo obtener un par clave-valor aleatorio de un diccionario?

4 minutos de lectura

avatar de usuario de tekknolagi
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?

Avatar de usuario de Gerrat
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 llamar list()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


avatar de usuario de patriciasz
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


avatar de usuario de lavee_singh
lavee_singh

dar un diccionario ausar:

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


avatar de usuario de user225312
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()))

Avatar de usuario de OBu
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)

Avatar de usuario de Karl Knechtel
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)

¿Ha sido útil esta solución?