2013-07-09 208 views
3

我試圖實現一個簡單的鄰接矩陣來跟蹤哪些節點連接到無向圖中的哪些節點。然而,我的鄰接矩陣通過改變整個列而不是單個單元來保持擰緊。這是我的代碼:鄰接矩陣未正確填充python

def setup_adj_matrix(size, edges): 
    # initialize matrix with zeros 
    adj_matrix = [[0] * size] * size 
    # edges is a list of tuples, representing 2 nodes connected by an edge 
    for edge in edges: 
     v1 = edge[0] 
     v2 = edge[1] 
     adj_matrix[v1][v2] = 1 
     adj_matrix[v2][v1] = 1 
    for row in adj_matrix: 
     print row 

用於與3個節點的曲線圖(0,1,2)和邊緣[(0,1),(0,2),(1,2)],我應該得到

[[0,1,1], 
[1,0,1], 
[1,1,0]] 

但是,我得到所有1。任何想法可能出現問題?

+0

http://docs.python.org/2/library/stdtypes.html# sequence-types-str-unicode-list-tuple-bytearray-buffer-xrange - 該段落中的註釋2可以解決你的問題。 – ersran9

回答

4

這些列表都是彼此的淺表副本,所以編輯一個時,您實際上是在編輯每一行。試試這個初始化矩陣:

adj_matrix = [[0] * size for i in range(size)] 
6

帶有list和int的乘法運算符返回對同一個列表的多個引用,而不是多個副本。你的數組包含九次相同的對象。

您可以創建一個雙榜理解正確的數組:

def init_matrix(x, y): 
    return [[[0] for i in range(x)] for j in range(y)] 
+0

感謝您的回覆!雖然我認爲我的目的,[0]應該只是0 :) –

2

其他人的答案做的是解決你的問題很好的工作,但如果你打算做任何類型的繁重工作與你的鄰接矩陣,它可能是有意義的使用numpy。作爲獎勵,初始化更簡單,打印陣列內置:

import numpy as np 

def setup_adj_matrix(N, edges): 
    A = np.zeros((N,N), dtype=int) 

    for (v1,v2) in edges: 
     A[v1,v2] = A[v2,v1] = 1 
    return A 

print setup_adj_matrix(3,[(0,1),(0,2),(1,2)]) 

這給:

[[0 1 1] 
[1 0 1] 
[1 1 0]]