2011-10-16 12 views

Respuesta

18

A dict es un conjunto desordenado de pares clave-valor. Cuando itera un dict, es efectivamente aleatorio. Pero para aleatorizar explícitamente la secuencia de pares clave-valor, debe trabajar con un objeto diferente que se ordena, como una lista. dict.items(), dict.keys() y dict.values() cada listas de devolución, que se pueden barajar.

items=d.items() # List of tuples 
random.shuffle(items) 
for key, value in items: 
    print key, value 

keys=d.keys() # List of keys 
random.shuffle(keys) 
for key in keys: 
    print key, d[key] 

O bien, si no se preocupan por las teclas:

values=d.values() # List of values 
random.shuffle(values) # Shuffles in-place 
for value in values: 
    print value 

también puede "ordenar por azar":

for key, value in sorted(d.items(), key=lambda x: random.random()): 
    print key, value 
+8

En Python3, 'd.items()', 'd.keys()' y 'd.values ​​()' producen un objeto iterador. Necesita convertir explícitamente ese iterador a la lista usando la función 'list()'. –

+0

"Cuando itera un' dict', es efectivamente aleatorio "- no lo es. Confiar en que incluso parezca aleatorio sería una mala idea, considerando que es muy probable que las cosas como las entradas salgan ordenadas. Además, la clasificación de clave aleatoria es O (nlog (n)) en lugar de O (n), por lo que probablemente debería evitarse. – user2357112

+0

¿Cómo adaptar esto para mezclar siempre el diccionario (manteniendo los enlaces entre la tecla derecha al valor correcto de la misma manera, por ejemplo, usando 'np.random.RandomState (100)'? –

7

No puede. Obtenga la lista de claves con .keys(), revíselos, luego repita la lista e indexe el dict original.

O use .items(), y mezcle e itere eso.

+0

O 'dict.values ​​()' si lo que quieres es los valores. –

0

Como Charles Brunet han dicho ya que el diccionario es una disposición aleatoria de los pares clave de valores. Pero para que sea realmente aleatorio, usarás un módulo aleatorio. He escrito una función que mezclará todas las teclas y, por lo tanto, mientras la itera, estará iterando aleatoriamente. Se puede entender con más claridad al ver el código:

def shuffle(q): 
    """ 
    This function is for shuffling 
    the dictionary elements. 
    """ 
    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 
    return selected_keys 

Ahora, cuando se llama a la función sólo tiene que pasar el parámetro (el nombre del diccionario que desea barajar) y obtendrá una lista de claves que se barajan. Finalmente puede crear un ciclo para la longitud de la lista y usar name_of_dictionary[key] para obtener el valor. Hope esto añadirá un valor a esta pila :)

Source: Radius Of Circle

Cuestiones relacionadas