Python 邻接矩阵未正确填充

Python 邻接矩阵未正确填充,python,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 ed

我试图实现一个简单的邻接矩阵来跟踪无向图中哪些节点连接到哪些节点。然而,我的邻接矩阵通过改变整个列而不是单个单元格而不断出错。这是我的密码:

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分。你知道问题出在哪里吗?

这些列表都是彼此的浅拷贝,所以当你编辑一个列表时,实际上是在编辑每一行。尝试以下方法初始化矩阵:

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

带有列表和int的乘法运算符返回对同一列表的多个引用,而不是多个副本。数组包含同一对象九次

您可以使用双列表创建正确的数组:

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

其他答案很好地解决了您的问题,但是如果您打算使用邻接矩阵进行任何类型的繁重工作,那么使用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]]

-注:该段中的两个可能会解决您的问题。谢谢您的回复!虽然我认为就我的目的而言,[0]应该是0:)