Search code examples
pythonmatrixgraphadjacency-listadjacency-matrix

Creating an adjacency list graph from a matrix in python


So I'm trying to make a graph of letters (to represent a boggle board) from a matrix of letters. So say I have something like:

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

I want each node to be a letter, but I'm having trouble figuring out how to get the neighbors for each node. For example, node A would have neighbors B, E, and F. While node K would have neighbors F, G, H, J, L, M, O, and P. Any help would be appreciated!


Solution

  • You could loop through every node in your matrix and then add every neighboring node at right & below to the result:

    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)
    

    Output:

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