为什么这个adj_matrix一直写到同一行,而不是在行上迭代



我正在尝试从邻接字典创建一个邻接矩阵。

基本上,我想创建一个用零填充的空矩阵。然后迭代邻接字典中的每一项,并在矩阵中分配正确的权重。但由于某种原因,代码一直将值分配给同一行。我用矩阵[][]赋值。使用python 3.7。

digraph = make_digraph() # A function that creates a class containing the adj_dict
adj_matrix = [[0] * len(digraph.adj_dict)] * len(digraph.adj_dict) # empty matrix
print(adj_matrix)
for source, destinations in digraph.adj_dict.items(): 
for destination in destinations:
print(int(source[1:]), int(destination[1:]), digraph.adj_dict[source][destination])
adj_matrix[int(source[1:])][int(destination[1:])] = digraph.adj_dict[source][destination]
print(adj_matrix)

但它给出了输出:

[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
0 1 4
1 2 1
1 7 2
1 8 2
2 11 3
3 4 1
3 12 2
4 5 1
4 8 3
4 14 2
5 6 2
5 9 2
6 0 1
6 10 2
7 9 2
8 9 2
8 11 1
10 0 1
10 7 2
10 9 3
11 1 4
11 12 4
12 2 1
12 8 3
12 13 2
13 4 2
14 9 2
[[1, 4, 1, 0, 2, 1, 2, 2, 3, 2, 2, 1, 4, 2, 2], [1, 4, 1, 0, 2, 1, 2, 2, 3, 2, 2, 1, 4, 2, 2], [1, 4, 1, 0, 2, 1, 2, 2, 3, 2, 2, 1, 4, 2, 2], [1, 4, 1, 0, 2, 1, 2, 2, 3, 2, 2, 1, 4, 2, 2], [1, 4, 1, 0, 2, 1, 2, 2, 3, 2, 2, 1, 4, 2, 2], [1, 4, 1, 0, 2, 1, 2, 2, 3, 2, 2, 1, 4, 2, 2], [1, 4, 1, 0, 2, 1, 2, 2, 3, 2, 2, 1, 4, 2, 2], [1, 4, 1, 0, 2, 1, 2, 2, 3, 2, 2, 1, 4, 2, 2], [1, 4, 1, 0, 2, 1, 2, 2, 3, 2, 2, 1, 4, 2, 2], [1, 4, 1, 0, 2, 1, 2, 2, 3, 2, 2, 1, 4, 2, 2], [1, 4, 1, 0, 2, 1, 2, 2, 3, 2, 2, 1, 4, 2, 2], [1, 4, 1, 0, 2, 1, 2, 2, 3, 2, 2, 1, 4, 2, 2], [1, 4, 1, 0, 2, 1, 2, 2, 3, 2, 2, 1, 4, 2, 2], [1, 4, 1, 0, 2, 1, 2, 2, 3, 2, 2, 1, 4, 2, 2], [1, 4, 1, 0, 2, 1, 2, 2, 3, 2, 2, 1, 4, 2, 2]]

这对我来说没有任何意义;1 2 1";我本想写adj_matrix[1][2]=1。但它似乎写入adj_matrix[0][2]=1?

我认为这一行是的问题

adj_matrix = [[0] * len(digraph.adj_dict)] * len(digraph.adj_dict)

您正在复制相同列表len(digraph.adj_dict)次,然后矩阵中的每一行都指向内存中相同位置的列表,但矩阵中的各行不应相同。将其更改为类似的列表理解

adj_matrix = [[0] * len(digraph.adj_dict) for _ in range(len(digraph.adj_dict))]

如果没有其他问题,应该修复它。

最新更新