存储合作网络/图的一种形式是邻接表。
由于网络大多是稀疏的,因此这种存储方式相比邻接矩阵空间效率更高。
下面是从原始数据里构建邻接表的代码实现。
构建邻接矩阵见:get_cooperate_matrix()
使用的数据形式示例:
其中F列是作者信息,其他列包含其他信息。
输入形式:
先把数据行读取到列表中。
# 二维列表形式的数据
co_list = [ ["AA | BB | CC | DD",2019],
["EE | BB | FF ",2018],
["AA | GG | FF | HH | KK",2019],
["CC | DD | FF | LL | AA",2020],
["AA | BB | FF ",2017],
["EE | BB | GG ",2018],
["DD | GG | LL | HH | EE",2019],
["AA | GG | CC | DD",2018]]
然后生成节点列表、边列表:
生成方法:get_nodes_edges()
# 节点列表
['AA', 'BB', 'CC', 'DD', 'EE', 'FF', 'GG', 'HH', 'KK', 'LL']
# 边列表
[['AA', 'BB'], ['AA', 'CC'], ['AA', 'DD'],
['BB', 'CC'], ['BB', 'DD'], ['CC', 'DD'],
['BB', 'EE'], ['BB', 'FF'], ['EE', 'FF'],
['AA', 'FF'], ['AA', 'GG'], ['AA', 'HH'],
['AA', 'KK'], ['FF', 'GG'], ['FF', 'HH'], ...]
生成邻接表:
输入节点列表、边列表。外层循环遍历所有节点,每个节点分别作为父节点,内层循环遍历所有边,把所有和父节点有连接的节点作为该父节点的子节点。
def get_adjacency_list(nodes_list,edge_list):
'''
nodes_list:节点列表
edge_list: 边列表
'''
# 初始化邻接表
adjacency_list = []
# 遍历节点名
for node in nodes_list:
node_co = []
# 每个节点的邻接表:首位初始化为头结点[node,0,0,0,...,0,0]
node_co.append(node)
# 遍历所有边,对节点进行匹配
for edge in edge_list:
# 对包含当前节点的边,提取连接关系。
if node in edge:
for each_node in edge:
if (each_node != node) and (each_node not in node_co):
node_co.append(each_node) # 添加子节点
adjacency_list.append(node_co)
return adjacency_list
结果:
第一列为所有节点。之后是和每个节点相连的边。