Python中邻接矩阵的邻接列表表示

问题描述

给定下面的两个邻接表表示

g = {
'I': ['J','K','M'],'J': ['I','L'],'K': ['I','J','L': ['J'],'M': ['I','K']
}

#Weighted 
g = {
'I': [('J',1),('K',2),('M',3)],'J': [('I',7),('L',5)],'K': [('I',('J',6)],'L': [('J','M': [(I,3),(K,6)]
}

如何以列表列表的形式输出等效邻接矩阵,特别是对于加权邻接列表。我已经应用了 How do I generate an adjacency matrix of a graph from a dictionary in python? 中的 karakfa 算法。但是,我似乎无法将其实现为加权图。

keys = sorted(g.keys())
M = [ [0]*len(keys) for i in range(len(keys)) ]
for a,b in [(keys.index(a),keys.index(b)) for a,row in g.items() for b in row]:
   M[a][b] = 1

它返回 ValueError: ('J',1) is not in list

解决方法

原因是你的字典键是你的顶点名称,但你传递的是一个 (vertex_name,weight) 的元组。此外,变量名称令人困惑并可能导致错误(b 使用了两次)。

keys = sorted(g.keys())
M = [ [0]*len(keys) for i in range(len(keys)) ]
for vertex_1,row in g.items():
    for vertex_2,weight in row:
        M[keys.index(vertex_1)][keys.index(vertex_2)] = weight

这给出:

[[0,1,2,3],[1,7,5,0],[2,6],[0,[3,6,0]]