随机播放列表并返回副本



我想洗一个数组,但我找到的只是像random.shuffle(x)这样的方法,从 在 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的情况下创建另一个随机播放?

这里的人们建议深拷贝,这肯定是矫枉过正。您可能不介意列表中的对象相同,您只想打乱它们的顺序。为此,列表直接提供浅层复制。

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

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

使用 copy.deepcopy 创建数组的副本,打乱副本。

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

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

disorderd_rectangle = rectangle

但是,请使用此方法或Veky提到的复制方法。

disorderd_rectangle = rectangle[:]

它将复制列表。

使用切片制作浅拷贝,然后随机播放拷贝:

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

使用 random.sample 打乱列表而不更改原始列表。

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

上面的代码片段较慢,但只是另一种方式。

最新更新