【问题标题】:Creating an adjacency list graph from a matrix in python从python中的矩阵创建邻接列表图
【发布时间】:2016-08-05 06:45:42
【问题描述】:

所以我试图从一个字母矩阵中制作一个字母图(代表一个拼图板)。所以说我有类似的东西:

[ [ A, B, C, D], 
  [E, F, G, H], 
  [I, J, K, L], 
  [M, N, O, P] ].

我希望每个节点都是一个字母,但我无法弄清楚如何获取每个节点的邻居。例如,节点 A 会有邻居 B、E 和 F。而节点 K 会有邻居 F、G、H、J、L、M、O 和 P。任何帮助都将不胜感激!

【问题讨论】:

标签: python matrix graph adjacency-list adjacency-matrix


【解决方案1】:

您可以遍历矩阵中的每个节点,然后将右下方的每个相邻节点添加到结果中:

matrix = [
    ['A', 'B', 'C', 'D'],
    ['E', 'F', 'G', 'H'],
    ['I', 'J', 'K', 'L'],
    ['M', 'N', 'O', 'P']
]

def add(adj_list, a, b):
    adj_list.setdefault(a, []).append(b)
    adj_list.setdefault(b, []).append(a)

adj_list = {}
for i in range(len(matrix)):
    for j in range(len(matrix[i])):
        if j < len(matrix[i]) - 1:
            add(adj_list, matrix[i][j], matrix[i][j+1])
        if i < len(matrix[i]) - 1:
            for x in range(max(0, j - 1), min(len(matrix[i+1]), j+2)):
                add(adj_list, matrix[i][j], matrix[i+1][x])

import pprint
pprint.pprint(adj_list)

输出:

{'A': ['B', 'E', 'F'],
 'B': ['A', 'C', 'E', 'F', 'G'],
 'C': ['B', 'D', 'F', 'G', 'H'],
 'D': ['C', 'G', 'H'],
 'E': ['A', 'B', 'F', 'I', 'J'],
 'F': ['A', 'B', 'C', 'E', 'G', 'I', 'J', 'K'],
 'G': ['B', 'C', 'D', 'F', 'H', 'J', 'K', 'L'],
 'H': ['C', 'D', 'G', 'K', 'L'],
 'I': ['E', 'F', 'J', 'M', 'N'],
 'J': ['E', 'F', 'G', 'I', 'K', 'M', 'N', 'O'],
 'K': ['F', 'G', 'H', 'J', 'L', 'N', 'O', 'P'],
 'L': ['G', 'H', 'K', 'O', 'P'],
 'M': ['I', 'J', 'N'],
 'N': ['I', 'J', 'K', 'M', 'O'],
 'O': ['J', 'K', 'L', 'N', 'P'],
 'P': ['K', 'L', 'O']}

【讨论】:

    【解决方案2】:

    假设您的矩阵是一个 n x m 矩阵,并且每个元素都是一个 唯一 字符串,如下所示:

    
        # The matrix
    
    
    matrix = [
        ['A', 'B', 'C', 'D'],
        ['E', 'F', 'G', 'H'],
        ['I', 'J', 'K', 'L'],
        ['M', 'N', 'O', 'P']
    ]
    

    可以先定位元素的索引:

    
        node = 'K' # Input
    
        # Get the matrix dimension
        n = len(matrix)
        m = len(matrix[0])
    
        # Assume there is exactly one matching node
        for i in xrange(n):
            for j in xrange(m):
                if matrix[i][j] == node:
                    x, y = i, j
    
    

    然后将邻居作为列表返回:

    # 获取(最多)8 个邻居 邻居 = [row[max(0,y-1):y+2] 矩阵中的行[max(0,x-1):x+2]] answer = set([v for r in 邻居 for v in r]) answer.remove(节点) 答案 = 列表(答案)

    如果节点可以多次出现,请参阅How to find the index of a value in 2d array in Python? 如果您是 Python 新手,这些链接可能对您有用:

    【讨论】:

      【解决方案3】:

      您必须使用字典来存储连接到节点的节点 :

      g = { "A" : ["D", "F"],
            "B" : ["C"],
            "C" : ["B", "C", "D", "E"],
            "D" : ["A", "C"],
            "E" : ["C"],
            "F" : ["D"]
          }
      

      取决于图表的结构。

      要获取图中节点的邻居,您可以简单地访问节点的值

      >>> g["A"]
      >>> ["D","F"]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多