Search code examples
pythonadjacency-matrix

Create an adjacency matrix using a dictionary with letter values converted to numbers in python


So I have a dictionary with letter values and keys and I want to generate an adjacency matrix using digits (0 or 1). But I don't know how to do that.

Here is my dictionary:

g = { "a" : ["c","e","b"],
      "b" : ["f","a"]}

And I want an output like this :

import numpy as np

new_dic = {'a':[0,1,1,0,1,0],'b':(1,0,0,0,0,1)}
rows_names = ['a','b'] # I use a list because dictionaries don't memorize the positions

adj_matrix = np.array([new_dic[i] for i in rows_names])

print(adj_matrix)

Output :

[[0 1 1 0 1 0]
[1 0 0 0 0 1]]

So it's an adjacency matrix: column/row 1 represent A, column/row 2 represent B ...

Thank you !

I don't know if it helps but here is how I convert all letters to numbers using ascii :

for key, value in g.items():
    nums = [str(ord(x) - 96) for x in value if x.lower() >= 'a' and x.lower() <= 'z']
    g[key] = nums
print(g)

Output :

{'a': ['3', '5', '2'], 'b': ['6', '1']}

So a == 1 b == 2 ...

So my problem is: If a take the keys a with the first value "e", how should I do so that the e is found in the column 5 line 1 and not in the column 2 line 1 ? and replacing the e to 1


Solution

  • Using comprehensions:

    g = {'a': ['c', 'e', 'b'], 'b': ['f', 'a']}
    vals = 'a b c d e f'.split()  # Column values
    
    new_dic = {k: [1 if x in v else 0 for x in vals] for k, v in g.items()}