[英]Having problems with python's random.shuffle
我想制作一个矩阵,其行是以下vector =的不同排列
[1,2,3,4,5,10,10,10,10,10]
我尝试使用random.shuffle函数,但似乎每次使用它时,它都会重新定义为其分配的所有对象。 例如,我尝试了以下方法:
vec=[1,2,3,4,5]
for i in range(5):
vec.append(10)
Matpreferences=[]
for i in range(10):
random.shuffle(vec)
Matpreferences.append(vec)
但是然后我得到所有行都相等的矩阵。
例如:
[0, 0, 1.0, 0, 2.0, 3.0, 0, 0.5, 2.5, 1.5, 0]
[0, 0, 1.0, 0, 2.0, 3.0, 0, 0.5, 2.5, 1.5, 0]
[0, 0, 1.0, 0, 2.0, 3.0, 0, 0.5, 2.5, 1.5, 0]
[0, 0, 1.0, 0, 2.0, 3.0, 0, 0.5, 2.5, 1.5, 0]
...
我什至尝试过类似的东西
Matpreferences=[]
for i in range(10):
random.shuffle(vec)
a=vec
Matpreferences.append(a)
但是它产生相同的结果。 有什么简单的方法可以解决这个问题?
非常感谢您提供的任何帮助=)
您将对象引用添加到列表。 将其视为指针。 您添加到Matpreferences中的每个vec都指向同一实例。
看这个例子:
>>> vec = [1,2,3,4,5]
>>> vec2 = vec
>>> random.shuffle(vec)
>>> print vec
[2, 4, 3, 1, 5]
>>> print vec2
[2, 4, 3, 1, 5]
>>>
正如你所看到的内容为vec
和vec2
是即使我没有洗牌一样vec2
。
您需要做的是将vec
的内容复制到新列表中,然后将该列表添加到Matpreferences中
将最后一行替换为
Matpreferences.append([x for x in vec])
要么
Matpreferences.append(vec[:])
您需要先复制一份vec
然后再对其进行洗牌:
import random
vec=[1,2,3,4,5]
for i in range(5):
vec.append(10)
Matpreferences=[]
for i in range(10):
v = vec[:]
random.shuffle(v)
Matpreferences.append(v)
从您的代码:
a=vec
Matpreferences.append(a)
在这里, a
在同一个数据点vec
点。 因此,当a
被改组时, vec
也会如此,指向vec
所有内容也是如此。
相比之下,由于下标[:]
,此代码创建数据的新独立副本:
v = vec[:]
由于v
是一个单独的和独立的副本,洗牌v
有没有影响vec
。
random.shuffle
将列表random.shuffle
,因此在每次调用后, vec
内容都将重新排序。 请注意, vec
是对列表的引用,因此,在列表中添加vec
10次后,它将包含10次相同的引用。 它们都拥有相同的列表。 这就是为什么您看到相同的列表。 vec
确实被改组了10次,但是在打印时只能看到最后一个排列。
要解决此问题,您每次都需要制作一个新的vec副本,将其混洗并将其附加到Matpreferences
。 或者,您可以Matpreferences
vec
,然后将其副本附加到Matpreferences
。
复制列表很容易,我认为最短的方法是使用切片:
Matpreferences.append(vec[:])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.