繁体   English   中英

python的random.shuffle有问题

[英]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]
>>> 

正如你所看到的内容为vecvec2是即使我没有洗牌一样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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM