Создать матрицу смежности из списка списков в зависимости от координат элементов

#list #adjacency-matrix

#Список #матрица смежности

Вопрос:

У меня есть список списков, таких как: myList = [[‘A’, ‘B’, ‘D’], [‘A’, ‘B’, ‘C’], [‘C’, ‘D’], [‘A’, ‘C’]].

Я хочу создать симметричную матрицу, где таким образом, чтобы ее (i, j)-й элемент был числом раз, когда элементы «i» и «j» совместно встречаются в любом вложенном списке в «myList». Например, ‘A’ и ‘B’ совпадают в двух списках (1-м и 2-м) в «myList». Таким образом, это будет означать, что MyAdj[‘A’, ‘B’] = MyAdj[‘B’, ‘A’] = 2. Любая помощь или перенаправление на аналогичный вопрос будут высоко оценены!

Здесь «i» и «j» не обязательно должны быть элементами («A» или «B»), а просто уникальными числовыми номерами (например, 0 и 1), относящимися к каждому элементу во всей коллекции списков в «myList». Итак, для примера «myList» выше это будет означать, что MyAdj будет матрицей 4×4.

Ответ №1:

Я полагаю, вам нужно сначала найти, сколько уникальных элементов вы ищете, и отсортировать их (это будет ваша форма матрицы). Затем для каждого i, j проверьте, сколько раз они встречаются одновременно в каждом списке myList. Ниже приведен пример в python3:

 import numpy as np

my_list = [['A', 'B', 'D'], ['A', 'B', 'C'], ['C', 'D'], ['A', 'C']]
unique_elem = sorted(set(sum(my_list, []))) # sorted list of unique elements
n = len(unique_elem)
my_adj = np.zeros((n,n), dtype= int) # matrix (n,n)

for i, a in enumerate(unique_elem):
    for j, b in enumerate(unique_elem):
        my_adj[i][j] = sum([True for seq in my_list if a in seq and b in seq])
  

где my_adj выводит:

    A B C D
A[[3 2 2 1]
B [2 2 1 1]
C [2 1 3 1]
D [1 1 1 2]]