循环python随机shuffle

时间:2016-08-22 21:16:07

标签: python list random while-loop

我试图用相同初始列表的排列来填充列表。我不明白为什么以下不起作用。

parts = [[],[]]
while len(parts[-1]) < 2:
  newval = random.choice([[1,2,3,4],[5,6,7,8]])
  for part in parts:
    random.shuffle(newval)
    part.append(newval)

预期结果如下: [[[6,7,8,5],[1,3,4,2]],[[5,8,6,7],[4,2,3,1]]]

2 个答案:

答案 0 :(得分:6)

random.shuffle就地工作,然后修改newval。您必须在追加到part时制作副本,否则相同的列表(或列表参考)将被随机播放并存储在part中。

import random

parts = [[],[]]
while len(parts[-1]) < 2:
  newval = random.choice([[1,2,3,4],[5,6,7,8]])
  for part in parts:
    random.shuffle(newval)
    part.append(newval[:])

print(parts)

可能的输出:

[[[3, 1, 2, 4], [5, 7, 6, 8]], [[1, 2, 4, 3], [6, 7, 5, 8]]]
[[[1, 3, 2, 4], [4, 2, 1, 3]], [[2, 4, 3, 1], [4, 3, 2, 1]]]
[[[7, 5, 6, 8], [3, 2, 4, 1]], [[8, 5, 6, 7], [1, 4, 3, 2]]]

答案 1 :(得分:3)

因为在Python中一切都是引用。将值附加到数组时,实际上是将引用添加到存储值的内存中。

说,您已将列表分配给第一个元素。在下一次迭代中,您重新洗牌此列表,您将更改内存中的值。因此,访问上一步中附加的元素时的值也会更改。

要解决此问题,请尝试附加copy.copy(newval)而不只是newval(不要忘记import copy

以下是您的代码相应更改:

import copy
parts = [[],[]]
while len(parts[-1]) < 2:
    newval = random.choice([[1,2,3,4],[5,6,7,8]])
    for part in parts:
        random.shuffle(newval)
        part.append(copy.copy(newval))