试图在Python中将邻接列表转换为邻接矩阵

时间:2017-04-23 12:49:31

标签: python algorithm matrix

即使我知道自己做错了什么,我也在努力研究如何有效地实现这一目标。我试图让我的代码读取邻接列表,例如一个无向的加权图:

[(1,5)],[(0,5),(2,7)],[(1,7)]

然后将其转换为邻接矩阵,它将返回:

[0,5,inf],[5,0,7],[inf,7,0]

然而,下面的代码返回[0,5,inf],[5,inf,0,inf,7],[inf,7,0],我知道为什么会这样。但是,我只想附加' inf'在[0,5,inf]之类的情况下,邻接矩阵因为0与2不相邻,因此其权重为“inf”。什么是最好的解决方案?

def adjacency_matrix(graph_string):
    adj_list = adjacency_list(graph_string)
    n = len(adj_list)
    adj_mat = [[] for _ in range(n)]
    for i in range(n):
        for j in range(n):
            if j == i:
                adj_mat[i].append(0)
            else:
                for neighbour, weight in adj_list[i]:
                    if j == neighbour:
                        adj_mat[i].append(weight)
                        break
                    elif j != neighbour:
                        adj_mat[i].append(float('inf'))
    return adj_mat

1 个答案:

答案 0 :(得分:0)

问题似乎出现在elif部分

elif j != neighbour:
    adj_mat[i].append(float('inf'))

因为你只想填补inf的缺失边缘。如果您的elif j < neighbour已排序,则使用条件adj_list将是正确的。

然而,更好的解决方案是在其他地方初始化零对角线和inf值的邻接矩阵。并且只填充邻接列表中的权重。这样你就可以避免考虑非边缘。

以下是一个简短的示例,说明如何使用numpy实现。

import numpy as np

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

用法:

adj_list = [(1,5)], [(0,5), (2,7)], [(1,7)]
adj_list_to_matrix(adj_list)