【问题标题】:How to convert an adjacency matrix to an adjacency list with python?如何使用python将邻接矩阵转换为邻接列表?
【发布时间】:2016-07-02 23:21:58
【问题描述】:

我有一个邻接矩阵,例如:

[[  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'}]}

?

【问题讨论】:

  • 您的邻接矩阵看起来完全是空的。这应该如何产生graph 数据?
  • @StefanPochmann 有原始的 adj。矩阵。我不得不回滚 OP 最近的编辑。不要为什么他/她会抹去原来的矩阵。

标签: python python-3.x matrix adjacency-list adjacency-matrix


【解决方案1】:

在集合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 将有助于动态构建列表值字典。

【讨论】:

    【解决方案2】:

    矩阵转换为邻接表的函数:

    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
    

    【讨论】:

    • 您好,欢迎来到 SO。您的答案仅包含代码。如果您还可以添加一些评论来解释它的作用和方式,那就更好了。你能请edit你的答案并添加它吗?谢谢!
    猜你喜欢
    • 1970-01-01
    • 2016-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多