遇到python&randoms.shuffle的问题

时间:2015-06-05 05:52:57

标签: python matrix random permutation 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)   

但它会产生相同的结果。有什么简单的方法来解决这个问题吗? 非常感谢任何给予的帮助=)

3 个答案:

答案 0 :(得分:3)

您将对象引用添加到列表中。把它想象成一个指针。您添加到Matpreferences的每个vec都指向同一个实例。

看看这个例子:

vec2

如您所见,即使我没有随机播放vec2vecMatpreferences.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[:])