2012-04-13 25 views
0

我想迭代地洗牌4个元素的列表,然后将混洗列表附加到不断增长的列表中。结果将是一个长4个元素的倍数的列表,每四个元素都是我原始列表的一些组合。迭代在python中生长一个洗牌列表

我的代码是

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

,我似乎已经是列表2将列表1的相同的改组型式一遍又一遍的问题。 ['Q','X',Z','Y','Q','X',Z','Y','Q','X','Z','''',''',''''''''''''''''''''''''''''''''''''''''' Y”,...]

回答

5

我想你想写

list2.extend(list1) 

否则,您将添加对象列表1的相同实例列表2一遍又一遍。

+0

是否有原因为什么list2.append(list1)一遍又一遍地添加相同的实例?我的逻辑是,在每个循环中,list1将被重新排列。 – 2012-04-13 18:30:06

+1

首先,请注意,使用'list2.append(list1)'您不要将list1的元素添加到list2。您将list1本身添加到list2(['X','Y','Z','Q']与[['X','Y','Z','Q']])。由于没有制作list1的副本,因此'random.shuffle(list1)'会更改list2中list1的所有出现。 – user1202136 2012-04-13 18:39:26

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 [:]'可以做到这一点。 – 2012-04-13 15:55:56

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