2012-04-13 21 views
0

4つの要素のリストを繰り返しシャッフルしようとしていますが、シャッフルされたリストを成長するリストに追加しようとしています。結果は、4つの要素の倍数であるリストになり、4つの要素はすべて元のリストの一部の組み合わせになります。反復的にシャッフルされたリストをPythonで作成する

私のコードは、私が持っているように見える問題は、リスト2には何度もリスト1の同じシャッフルバージョンになるということです

import random 
list1 = ['X','Y','Z','Q'] 
list2 = [] 
for drop in range(0,72/4): 
    random.shuffle(list1) 
    list2.append(list1) 

です。 [Q、X、Z、Y、Q、X、Z、Y、Q、X、Z、Z] Y」、...]

答えて

5

私はあなたがそうでなければ

list2.extend(list1) 

を書きたかった、あなたは何度も繰り返しLIST2するオブジェクトリスト1の同じインスタンスを追加すると思います。

+0

list2.append(list1)が同じインスタンスを何度も何度も繰り返している理由はありますか?私の論理は、各ループ中にlist1が再配置されるということでした。 –

+1

まず、 'list2.append(list1)'ではlist1の要素をlist2に追加しないことに注意してください。 list1(['X'、 'Y'、 'Z'、 'Q']])にリスト1を追加します。 list1のコピーが作成されていないので、 'random.shuffle(list1)'はlist2のlist1のすべての出現を変更します。 – user1202136

0

list1をシャッフルすると、list1のすべてのインスタンスがシャッフルされます。 list1をlist2に追加すると、同じリストを何度も何度も繰り返していきます。あなたが別のリストにリストを追加すると

deepcopy

import random, copy 
list1 = [1,2,3,4] 
list2 = [] 
for i in xrange(10): 
    random.shuffle(list1) 
    list2.append(copy.deepcopy(list1)) 
+1

おそらく、 'copy.deepcopy()'はあまりにも多すぎます。単純な 'list1 [:]'はそのトリックを行います。 –

2

を使用してみてください、あなたはそのリストのコピーを行っていない - あなたは、元のリストに別の参照を追加しています。追加しようとするすべての試みは、実際には同じオブジェクトへの参照であり、一方の変更はすべての変更です。

ここに、この驚くべき結果のデモンストレーションがあります。

>>> list1 = ['X', 'Y', 'Z', 'Q'] 
>>> list2 = [] 
>>> list2.append(list1) 
>>> list2.append(list1) 
>>> list2 
[['X', 'Y', 'Z', 'Q'], ['X', 'Y', 'Z', 'Q']] 
>>> list2[0][0] = 'A' 
>>> list2 
[['A', 'Y', 'Z', 'Q'], ['A', 'Y', 'Z', 'Q']] 
>>> list1[0] = 'B' 
>>> list2 
[['B', 'Y', 'Z', 'Q'], ['B', 'Y', 'Z', 'Q']] 
関連する問題