「Python数据分析」 使用邻接表存储共现/合作网络(无向图)

存储合作网络/图的一种形式是邻接表。

由于网络大多是稀疏的,因此这种存储方式相比邻接矩阵空间效率更高。

下面是从原始数据里构建邻接表的代码实现。
构建邻接矩阵见: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

结果:

第一列为所有节点。之后是和每个节点相连的边。
邻

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值