迭代在python中生成一个洗牌列表

时间:2012-04-13 15:33:02

标签: python list random

我正在尝试迭代地混洗4个元素的列表,然后将混洗列表附加到不断增长的列表中。结果将是一个列表,它是4个元素长的一部分,每四个元素是我原始列表的某种组合。

我的代码是

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

我似乎遇到的问题是list2将一遍又一遍地与list1的洗牌版本相同。

示例list2:['Q','X',Z','Y','Q','X',Z','Y','Q','X',Z','Y ”,...]

3 个答案:

答案 0 :(得分:5)

我想你想写

list2.extend(list1)

否则,您将反复将对象list1的相同实例添加到list2。

答案 1 :(得分: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']]

答案 2 :(得分: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))