根据元素的同余性从列表列表创建邻接矩阵

问题描述

我有一个列表列表,例如:MyList = [['A','B','D'],['A','B','C'],['C','D '],['A','C']]。

我想创建一个对称矩阵,使第(i,j)个元素成为“ MyList”的任何子列表中同时出现“ i”和“ j”元素的次数。例如,“ A”和“ B”同时出现在“ MyList”中的两个列表(第1个和第2个)中。因此,这意味着MyAdj ['A','B'] = MyAdj ['B','A'] =2。对于任何帮助或重定向到类似问题的人,将非常感谢!

此处,“ i”和“ j”不必是元素(“ A”或“ B”),而仅是与列表中整个列表集合中的每个元素相关的唯一数字(例如0和1)。 “我的清单”。因此,对于上面的“ MyList”示例,这意味着MyAdj将是4x4矩阵。

解决方法

我想您必须首先找到要搜索的独特元素并将其排序(这将是矩阵形状)。然后,对于每个i,j,检查它们在MyList的每个列表上同时发生了多少次。以下是python3中的示例:

import numpy as np

my_list = [['A','B','D'],['A','C'],['C','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]]