python 的 random.shuffle 有问题

Having problems with python's random.shuffle

我想制作一个矩阵,其行是以下向量的不同排列=
[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)   

但它产生了相同的结果。有什么简单的方法可以解决这个问题吗?
非常感谢您提供的任何帮助 =)

在随机播放之前,您需要复制 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是一个单独的独立副本,洗牌vvec没有影响。

您正在向列表中添加一个对象引用。把它想象成一个指针。您添加到 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]
>>> 

如你所见,vecvec2的内容是一样的,即使我没有洗牌vec2

您需要做的是将 vec 的内容复制到一个新列表中,然后将该列表添加到 Matpreferences

将你的最后一行替换为

Matpreferences.append([x for x in vec])

Matpreferences.append(vec[:])

random.shuffle 就地打乱列表,因此每次调用后,vec 的内容都会打乱。请注意,vec 是对列表的引用,因此当您在列表中附加 vec 10 次时,它包含 10 次相同的引用。他们都拥有相同的列表。这就是您看到相同列表的原因。 vec 确实打乱了 10 次,但打印时只能看到最后一个排列。

要解决此问题,您需要每次都制作一个新的 vec 副本,将副本打乱并附加到 Matpreferences。或者您可以随机播放 vec,然后将其副本附加到 Matpreferences

复制列表很容易,我认为最短的是使用切片:

Matpreferences.append(vec[:])