Python:随机播放并创建一个新数组

时间:2015-05-15 06:47:19

标签: python

我想要改组一个数组,但我找到的只是random.shuffle(x)的方法,来自Best way to randomize a list of strings in Python

我可以做点什么吗

import random
rectangle = [(0,0),(0,1),(1,1),(1,0)]
# I want something like
# disorderd_rectangle = rectangle.shuffle

现在我只能逃脱

disorderd_rectangle = rectangle
random.shuffle(disorderd_rectangle)
print(disorderd_rectangle)
print(rectangle)

但它返回

[(1, 1), (1, 0), (0, 1), (0, 0)]
[(1, 1), (1, 0), (0, 1), (0, 0)]

所以original array也发生了变化。如何在不改变原始版本的情况下创建另一个混洗array

6 个答案:

答案 0 :(得分:5)

这里的人们建议使用深度扫描,这肯定是一种矫枉过正。您可能不介意列表中的对象是相同的,您只是想要改变它们的顺序。为此,列表直接提供浅层复制。

rectangle2 = rectangle.copy()
random.shuffle(rectangle2)

关于您的误解:请阅读http://nedbatchelder.com/text/names.html#no_copies

答案 1 :(得分:3)

使用copy.deepcopy创建数组副本,随机播放副本。

c = copy.deepcopy(rectangle)
random.shuffle(c)

答案 2 :(得分:2)

看看:Immutable vs Mutable types。这就是为什么你需要一个额外的功能来创建列表副本

的原因

答案 3 :(得分:2)

你需要复制一个列表,默认情况下python只会在你写的时候创建指向同一个对象的指针:

disorderd_rectangle = rectangle

但是请使用这个或Veky提到的复制方法。

disorderd_rectangle = rectangle[:]

它会复制一份清单。

答案 4 :(得分:1)

使用切片制作浅色副本,然后随机播放副本:

>>> rect = [(0,0),(0,1),(1,1),(1,0)]
>>> sh_rect=rect[:]
>>> random.shuffle(sh_rect)
>>> sh_rect
[(0, 1), (1, 0), (1, 1), (0, 0)]
>>> rect
[(0, 0), (0, 1), (1, 1), (1, 0)]

答案 5 :(得分:0)

使用 random.sample 在不改变原始列表的情况下随机播放列表。

from random import sample
rect = [(0,0),(0,1),(1,1),(1,0)]
shuffled_rect = sample(rect, len(rect))

上面的代码片段会更快,因为你没有深度复制你的列表。