2011-01-25 8 views
7

Estoy intentando crear una lista aleatoria de claves mediante la iteración:lista de Python no barajar en un bucle

import random 

keys = ['1', '2', '3', '4', '5'] 
random.shuffle(keys) 
print keys 

Esto funciona perfecto. Sin embargo, si lo pongo en un bucle y capturar la salida:

a = [] 
for x in range(10): 
    random.shuffle(keys) 
    a.append(keys) 

estoy recibiendo 10 veces de la misma aleatoria ?! Obviamente, algo está fundamentalmente mal aquí ... Gracias de antemano.

Respuesta

16

El problema es que está barajando la lista en su lugar y luego agrega la referencia de la lista a la lista combinada. Por lo tanto, terminas con la misma estructura de lista 10 veces. "Cambio fundamental" es que la lista debe copiarse antes de anexarla.

Aquí hay una forma un poco más "pitónica" de lograr el mismo resultado con la comprensión de la lista.

 
import random 

def shuffleACopy(x): 
     b = x[:] # make a copy of the keys 
     random.shuffle(b) # shuffle the copy 
     return b # return the copy 

keys = [1,2,3,4,5,6,7,8] 
a = [shuffleACopy(keys) for x in range(10)] 
print(a) 
+0

* palma de la cara * Parece tan obvio ahora. ¡Muchas gracias! –

+2

Otra manera pitónica: '[random.sample (keys, 5) for _ in range (10)]' – razpeitia

+0

¡Golpeado 'de nuevo'! – Penn

3

Hypnos ya ha respondido a una solución muy correcta, por lo que sólo te estoy dando una forma más visual para entender lo que pasó y cómo detectar ese tipo de cosas en el futuro:

import random 
keys = ['1', '2', '3', '4', '5'] 
a = [] 
for x in range(10): 
    random.shuffle(keys) 
    a.append(keys) 
    print a 

da:

[['4', '5', '3', '2', '1']] 
[['2', '5', '1', '4', '3'], ['2', '5', '1', '4', '3']] 
[['2', '5', '4', '1', '3'], ['2', '5', '4', '1', '3'], ['2', '5', '4', '1', '3']] 
[['5', '4', '3', '1', '2'], ['5', '4', '3', '1', '2'], ['5', '4', '3', '1', '2'], ['5', '4', '3', '1', '2']] 
[['1', '4', '3', '2', '5'], ['1', '4', '3', '2', '5'], ['1', '4', '3', '2', '5'], ['1', '4', '3', '2', '5'], ['1', '4', '3', '2', '5']] 
[['2', '3', '4', '1', '5'], ['2', '3', '4', '1', '5'], ['2', '3', '4', '1', '5'], ['2', '3', '4', '1', '5'], ['2', '3', '4', '1', '5'], ['2', '3', '4', '1', '5']] 
[['2', '1', '4', '5', '3'], ['2', '1', '4', '5', '3'], ['2', '1', '4', '5', '3'], ['2', '1', '4', '5', '3'], ['2', '1', '4', '5', '3'], ['2', '1', '4', '5', '3'], ['2', '1', '4', '5', '3']] 
[['2', '5', '3', '4', '1'], ['2', '5', '3', '4', '1'], ['2', '5', '3', '4', '1'], ['2', '5', '3', '4', '1'], ['2', '5', '3', '4', '1'], ['2', '5', '3', '4', '1'], ['2', '5', '3', '4', '1'], ['2', '5', '3', '4', '1']] 
[['3', '5', '2', '4', '1'], ['3', '5', '2', '4', '1'], ['3', '5', '2', '4', '1'], ['3', '5', '2', '4', '1'], ['3', '5', '2', '4', '1'], ['3', '5', '2', '4', '1'], ['3', '5', '2', '4', '1'], ['3', '5', '2', '4', '1'], ['3', '5', '2', '4', '1']] 
[['4', '2', '3', '5', '1'], ['4', '2', '3', '5', '1'], ['4', '2', '3', '5', '1'], ['4', '2', '3', '5', '1'], ['4', '2', '3', '5', '1'], ['4', '2', '3', '5', '1'], ['4', '2', '3', '5', '1'], ['4', '2', '3', '5', '1'], ['4', '2', '3', '5', '1'], ['4', '2', '3', '5', '1']] 

Además, observando que random.shuffle no devuelve nada, puede empezar a sospechar que la transformación se realiza en el lugar .

Cuestiones relacionadas