试图写一个代码,将图的表示从邻接列表转换为邻接矩阵。
该函数应该输入一个邻接列表 adj_list = [[1,2],[2],[],[0,1]]
并输出二进制矩阵
adj_mat = [0. 1. 1. 0]
[0. 0. 1. 0.]
[0. 0. 0. 0.]
[1. 1. 0. 0.]
然而运行该代码
def adj_list_to_matrix(adj_list):
n = len(adj_list)
adj_matrix = np.nan * np.ones((n,n))
np.fill_diagonal(adj_matrix,0)
for i in range(n):
for j, w in adj_list[i]:
adj_matrix[i,j] = w
return adj_matrix
产生错误信息
for j, w in adj_list[i]:
TypeError: cannot unpack non-iterable int object
谁能帮助解决这个问题,得到一个可行的代码?
for j, w in adj_list[i]:
不工作,因为 adj_list[i]
只是一个列表,所以你只能在for循环中解包出一个值。看起来你想要的是 w
作为权重因子,但你的邻接列表没有任何权重。
你可以这样做,假设所有的权重都是1(我想这是你基于问题中的预期输出而想要的)。
def adj_list_to_matrix(adj_list):
n = len(adj_list)
adj_matrix = np.nan * np.ones((n,n))
np.fill_diagonal(adj_matrix,0)
for i in range(n):
for j in adj_list[i]:
adj_matrix[i,j] = 1
return adj_matrix
输出
[[ 0., 1., 1., nan],
[nan, 0., 1., nan],
[nan, nan, 0., nan],
[ 1., 1., nan, 0.]])
如果你想要一个加权邻接矩阵,你需要把权重放在 adj_list
像这样。
adj_list = [{1:0.2,2:0.5},{2:1},{},{0:0.1,1:0.6}]
那么你的代码只需要稍加修改就可以了。
def adj_list_to_matrix(adj_list):
n = len(adj_list)
adj_matrix = np.nan * np.ones((n,n))
np.fill_diagonal(adj_matrix,0)
for i in range(n):
for j, w in adj_list[i].items():
adj_matrix[i,j] = w
return adj_matrix
产出
[[0. , 0.2, 0.5, nan],
[nan, 0. , 1. , nan],
[nan, nan, 0. , nan],
[0.1, 0.6, nan, 0. ]]