我想制作一个矩阵,其行与以下向量的不同排列=
[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)
但它会产生相同的结果。有什么简单的方法来解决这个问题吗? 非常感谢任何给予的帮助=)
答案 0 :(得分:3)
您将对象引用添加到列表中。把它想象成一个指针。您添加到Matpreferences的每个vec都指向同一个实例。
看看这个例子:
vec2
如您所见,即使我没有随机播放vec2
,vec
和Matpreferences.append([x for x in vec])
的内容也是相同的。
您需要做的是将Matpreferences.append(vec[:])
的内容复制到新列表中,然后将该列表添加到Matpreferences
用
替换你的最后一行set @total= (select count(*) from @exceptions);
或
// Sample data
{
"chart": {
"showpercentagevalues": "1",
"use3dlighting": "0",
"showshadow": "0",
"placevaluesinside": "1",
"animation": "0"
},
"data": [{
"label": "ST_Clean",
"value": "33",
"color": "f7bc34"
}, {
"label": "ST_Eff",
"value": "67",
"color": "e24b1a"
}]
}
答案 1 :(得分:1)
您需要先制作a=vec
Matpreferences.append(a)
的副本,然后再进行随机播放:
a
从你的代码:
vec
此处,a
指向vec
指向的相同数据。因此,当vec
被洗牌时,[:]
也是如此,所有指向v = vec[:]
的内容也是如此。
相比之下,由于订阅v
,此代码会创建一个新的独立数据副本:
v
由于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
没有影响。
答案 2 :(得分:1)
random.shuffle
将列表移动到位,因此在每次调用后,vec
的内容都会被洗牌。请注意,vec
是对列表的引用,因此当您在列表中追加vec
10次时,它会包含相同的引用10次。他们都拥有相同的名单。这就是你看到相同列表的原因。 vec
确实已经洗了10次,但是只有在打印时才能看到最后的排列。
要解决此问题,您需要每次制作一份新的vec副本,随机播放副本并将其附加到Matpreferences
。或者您可以随机播放vec
,然后将其副本附加到Matpreferences
。
复制列表很简单,我认为最短的是使用切片:
Matpreferences.append(vec[:])