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
是一个单独的独立副本,洗牌v
对vec
没有影响。
您正在向列表中添加一个对象引用。把它想象成一个指针。您添加到 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[:])
random.shuffle
就地打乱列表,因此每次调用后,vec
的内容都会打乱。请注意,vec
是对列表的引用,因此当您在列表中附加 vec
10 次时,它包含 10 次相同的引用。他们都拥有相同的列表。这就是您看到相同列表的原因。 vec
确实打乱了 10 次,但打印时只能看到最后一个排列。
要解决此问题,您需要每次都制作一个新的 vec 副本,将副本打乱并附加到 Matpreferences
。或者您可以随机播放 vec
,然后将其副本附加到 Matpreferences
。
复制列表很容易,我认为最短的是使用切片:
Matpreferences.append(vec[:])
我想制作一个矩阵,其行是以下向量的不同排列=
[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
是一个单独的独立副本,洗牌v
对vec
没有影响。
您正在向列表中添加一个对象引用。把它想象成一个指针。您添加到 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[:])
random.shuffle
就地打乱列表,因此每次调用后,vec
的内容都会打乱。请注意,vec
是对列表的引用,因此当您在列表中附加 vec
10 次时,它包含 10 次相同的引用。他们都拥有相同的列表。这就是您看到相同列表的原因。 vec
确实打乱了 10 次,但打印时只能看到最后一个排列。
要解决此问题,您需要每次都制作一个新的 vec 副本,将副本打乱并附加到 Matpreferences
。或者您可以随机播放 vec
,然后将其副本附加到 Matpreferences
。
复制列表很容易,我认为最短的是使用切片:
Matpreferences.append(vec[:])