2011-01-25 9 views
7

Próbuję utworzyć listę kluczy randomizowane przez powtarzanie:lista Python nie losowe w pętli

import random 

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

To działa idealnie. Jednakże, jeśli mogę umieścić go w pętli i przechwytywać dane wyjściowe:

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

Dostaję 10 razy tego samego Shuffle ?! Oczywiście coś tu jest nie tak z góry ... Z góry dziękuję.

Odpowiedz

16

Problem polega na tym, że tasuje się listę na miejscu, a następnie dodajemy listę do listy łączonej. W ten sposób uzyskujesz 10 razy taką samą strukturę listy. "Zmiana fundamentalna" oznacza, że ​​listę należy skopiować przed jej dołączeniem.

Oto nieco bardziej "pythonic" sposób osiągnięcia tego samego wyniku ze zrozumieniem listy.

 
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

* dłoń na twarzy * Teraz wydaje się to takie oczywiste. Dziękuję Ci bardzo! –

+2

Inna pytonicka: '[random.sample (keys, 5) dla _ w zakresie (10)]' – razpeitia

+0

Pobity ponownie "!"! – Penn

3

Hypnos odpowiedział już bardzo poprawne rozwiązanie, więc ja tylko daje bardziej wizualny sposób, aby zrozumieć, co się stało i jak rozpoznać tych rodzaju rzeczy w przyszłości:

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

daje:

[['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']] 

również zauważyć, że random.shuffle nic nie wróci, można zacząć podejrzewać, że transformacja odbywa w miejscu.