如何将邻接矩阵转换为 python 的邻接表?
How to convert an adjacency matrix to an adjacency list with python?
我有一个邻接矩阵,如:
[[ 0., 15., 0., 7., 10., 0.],
[ 15., 0., 9., 11., 0., 9.],
[ 0., 9., 0., 0., 12., 7.],
[ 7., 11., 0., 0., 8., 14.],
[ 10., 0., 12., 8., 0., 8.],
[ 0., 9., 7., 14., 8., 0.]]
如何将它转换成像下面这样的邻接表?
graph = {'1': [{'2':'15'}, {'4':'7'}, {'5':'10'}],
'2': [{'3':'9'}, {'4':'11'}, {'6':'9'}],
'3': [{'5':'12'}, {'6':'7'}],
'4': [{'5':'8'}, {'6':'14'}],
'5': [{'6':'8'}]}
?
保留集合中已添加边的列表 edges
。这些边存储在 frozenset
中,因此不会复制已添加的对。
然后通过枚举 起始索引为 1 的外部列表构建图表,然后枚举起始索引为 1 的内部列表。零值条目通过值的 if
条件被消除:
from collections import defaultdict
from pprint import pprint
l =[[ 0., 15., 0., 7., 10., 0.],
[ 15., 0., 9., 11., 0., 9.],
[ 0., 9., 0., 0., 12., 7.],
[ 7., 11., 0., 0., 8., 14.],
[ 10., 0., 12., 8., 0., 8.],
[ 0., 9., 7., 14., 8., 0.]]
graph = defaultdict(list)
edges = set()
for i, v in enumerate(l, 1):
for j, u in enumerate(v, 1):
if u != 0 and frozenset([i, j]) not in edges:
edges.add(frozenset([i, j]))
graph[i].append({j: u})
pprint(graph)
# {1: [{2: 15.0}, {4: 7.0}, {5: 10.0}],
# 2: [{3: 9.0}, {4: 11.0}, {6: 9.0}],
# 3: [{5: 12.0}, {6: 7.0}],
# 4: [{5: 8.0}, {6: 14.0}],
# 5: [{6: 8.0}]}
使用将 list
作为默认值的 defaultdict
将有助于动态构建列表值字典。
将矩阵转换为邻接表的函数:
def convert_matrix_to_Adj_list(self,matrix):
for i in range(0,self.V):
for j in range(0,self.V):
if matrix[i][j]:
# print(i,j)
self.graph[i].append(j)# add an edge to the graph
self.graph[j].append(i)# add an edge to the graph
我有一个邻接矩阵,如:
[[ 0., 15., 0., 7., 10., 0.],
[ 15., 0., 9., 11., 0., 9.],
[ 0., 9., 0., 0., 12., 7.],
[ 7., 11., 0., 0., 8., 14.],
[ 10., 0., 12., 8., 0., 8.],
[ 0., 9., 7., 14., 8., 0.]]
如何将它转换成像下面这样的邻接表?
graph = {'1': [{'2':'15'}, {'4':'7'}, {'5':'10'}],
'2': [{'3':'9'}, {'4':'11'}, {'6':'9'}],
'3': [{'5':'12'}, {'6':'7'}],
'4': [{'5':'8'}, {'6':'14'}],
'5': [{'6':'8'}]}
?
保留集合中已添加边的列表 edges
。这些边存储在 frozenset
中,因此不会复制已添加的对。
然后通过枚举 起始索引为 1 的外部列表构建图表,然后枚举起始索引为 1 的内部列表。零值条目通过值的 if
条件被消除:
from collections import defaultdict
from pprint import pprint
l =[[ 0., 15., 0., 7., 10., 0.],
[ 15., 0., 9., 11., 0., 9.],
[ 0., 9., 0., 0., 12., 7.],
[ 7., 11., 0., 0., 8., 14.],
[ 10., 0., 12., 8., 0., 8.],
[ 0., 9., 7., 14., 8., 0.]]
graph = defaultdict(list)
edges = set()
for i, v in enumerate(l, 1):
for j, u in enumerate(v, 1):
if u != 0 and frozenset([i, j]) not in edges:
edges.add(frozenset([i, j]))
graph[i].append({j: u})
pprint(graph)
# {1: [{2: 15.0}, {4: 7.0}, {5: 10.0}],
# 2: [{3: 9.0}, {4: 11.0}, {6: 9.0}],
# 3: [{5: 12.0}, {6: 7.0}],
# 4: [{5: 8.0}, {6: 14.0}],
# 5: [{6: 8.0}]}
使用将 list
作为默认值的 defaultdict
将有助于动态构建列表值字典。
将矩阵转换为邻接表的函数:
def convert_matrix_to_Adj_list(self,matrix):
for i in range(0,self.V):
for j in range(0,self.V):
if matrix[i][j]:
# print(i,j)
self.graph[i].append(j)# add an edge to the graph
self.graph[j].append(i)# add an edge to the graph