问题描述
我有一个列表列表,例如: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]]