Python 如何从列表中生成邻接矩阵?

Python 如何从列表中生成邻接矩阵?,python,list,adjacency-matrix,Python,List,Adjacency Matrix,我有这样一个清单: [['10', '20', 2], ['10', '21', 2], ['10', '1', 2], ['10', '0', 3], ['10', '3', 2], ['10', '2', 2], ['10', '5', 3], ['10', '4', 3], ['10', '7', 2], ['10', '6', 2], ['10', '9', 2], ['10', '8', 2], ['10', '11', 2], ['10', '10', 2], ['10', '1

我有这样一个清单:

[['10', '20', 2], ['10', '21', 2], ['10', '1', 2], ['10', '0', 3], ['10', '3', 2],
 ['10', '2', 2], ['10', '5', 3], ['10', '4', 3], ['10', '7', 2], ['10', '6', 2],
 ['10', '9', 2], ['10', '8', 2], ['10', '11', 2], ['10', '10', 2], ['10', '13', 2],
 ['10', '12', 2], ['10', '15', 2], ['10', '14', 2], ['10', '17', 0], ['10', '16', 3],
 ['10', '19', 2], ['10', '18', 2], ['1', '20', 3], ['1', '21', 3], ['1', '1', 3],
 ['1', '0', 0], ['1', '3', 3], ['1', '2', 3], ['1', '5', 4], ['1', '4', 4],
 ['1', '7', 3], ['1', '6', 3], ['1', '9', 3], ['1', '8', 3], ['1', '11', 3],
 ['1', '10', 3], ['1', '13', 3], ['1', '12', 3], ['1', '15', 3]]
(比这个大得多)第一和第二项实际上是节点名,第三项是它们之间的边权重(虽然我没有绘制图表,这是一个列表)


我想用这个列表做一个邻接矩阵

是的,您可以使用

In[1]:In_list=[[10',20',2],[10',21',2],[10',1',2],[10',0',3],[10',3',2],[10]
...: , '2', 2], ['10', '5', 3], ['10', '4', 3], ['10', '7', 2], ['10', '6', 2], ['10', '9', 2], ['10', '
...: 8', 2], ['10', '11', 2], ['10', '10', 2], ['10', '13', 2], ['10', '12', 2], ['10', '15', 2], ['10',
...:  '14', 2], ['10', '17', 0], ['10', '16', 3], ['10', '19', 2], ['10', '18', 2], ['1', '20', 3], ['1'
...: , '21', 3], ['1', '1', 3], ['1', '0', 0], ['1', '3', 3], ['1', '2', 3], ['1', '5', 4], ['1', '4', 4
...: ], ['1', '7', 3], ['1', '6', 3], ['1', '9', 3], ['1', '8', 3], ['1', '11', 3], ['1', '10', 3], ['1'
...: , '13', 3], ['1', '12', 3], ['1', '15', 3]]                                                        
在[2]中:从集合导入defaultdict
在[3]中:tree=lambda:defaultdict(tree)
在[5]中:形容词mat=tree()
In[6]:对于In_列表中的边:
…:开始、结束、重量=边缘
…:调整材料[开始][结束]=重量
...:                                 
在[7]中:形容词
出[7]:
defaultdict(,
{'1':defaultdict(,
{'0': 0,                          
'1': 3,                          
'10': 3,                         
'11': 3,                         
'12': 3,                         
'13': 3,                         
'15': 3,                         
'2': 3,                          
'20': 3,                         
'21': 3,                         
'3': 3,                          
'4': 4,                          
'5': 4,                          
'6': 3,
'7': 3,
'8': 3,
'9': 3}),
“10”:defaultdict(,
{'0': 3,
'1': 2,
'10': 2,
'11': 2,
'12': 2,
'13': 2,
'14': 2,
'15': 2,
'16': 3,
'17': 0,
'18': 2,
'19': 2,
'2': 2,
'20': 2,
'21': 2,
'3': 2,
'4': 3,
'5': 3,
'6': 2,
'7': 2,
'8': 2,
'9': 2})})
当我实现这一点时,我注意到所有边都起源于1或10。嗯,奇怪

解释

  • defaultdict只是一个生动的哈希映射的花哨名称(如果您来自perl背景)
  • 矩阵中的条目是边权重
  • 如果边是双向的,则只需在for循环中添加
    adj_mat[end][start]=weight

  • 是的,你可以用一个

    In[1]:In_list=[[10',20',2],[10',21',2],[10',1',2],[10',0',3],[10',3',2],[10]
    ...: , '2', 2], ['10', '5', 3], ['10', '4', 3], ['10', '7', 2], ['10', '6', 2], ['10', '9', 2], ['10', '
    ...: 8', 2], ['10', '11', 2], ['10', '10', 2], ['10', '13', 2], ['10', '12', 2], ['10', '15', 2], ['10',
    ...:  '14', 2], ['10', '17', 0], ['10', '16', 3], ['10', '19', 2], ['10', '18', 2], ['1', '20', 3], ['1'
    ...: , '21', 3], ['1', '1', 3], ['1', '0', 0], ['1', '3', 3], ['1', '2', 3], ['1', '5', 4], ['1', '4', 4
    ...: ], ['1', '7', 3], ['1', '6', 3], ['1', '9', 3], ['1', '8', 3], ['1', '11', 3], ['1', '10', 3], ['1'
    ...: , '13', 3], ['1', '12', 3], ['1', '15', 3]]                                                        
    在[2]中:从集合导入defaultdict
    在[3]中:tree=lambda:defaultdict(tree)
    在[5]中:形容词mat=tree()
    In[6]:对于In_列表中的边:
    …:开始、结束、重量=边缘
    …:调整材料[开始][结束]=重量
    ...:                                 
    在[7]中:形容词
    出[7]:
    defaultdict(,
    {'1':defaultdict(,
    {'0': 0,                          
    '1': 3,                          
    '10': 3,                         
    '11': 3,                         
    '12': 3,                         
    '13': 3,                         
    '15': 3,                         
    '2': 3,                          
    '20': 3,                         
    '21': 3,                         
    '3': 3,                          
    '4': 4,                          
    '5': 4,                          
    '6': 3,
    '7': 3,
    '8': 3,
    '9': 3}),
    “10”:defaultdict(,
    {'0': 3,
    '1': 2,
    '10': 2,
    '11': 2,
    '12': 2,
    '13': 2,
    '14': 2,
    '15': 2,
    '16': 3,
    
    In [1]: in_list =  [['10', '20', 2], ['10', '21', 2], ['10', '1', 2], ['10', '0', 3], ['10', '3', 2], ['10'
       ...: , '2', 2], ['10', '5', 3], ['10', '4', 3], ['10', '7', 2], ['10', '6', 2], ['10', '9', 2], ['10', '
       ...: 8', 2], ['10', '11', 2], ['10', '10', 2], ['10', '13', 2], ['10', '12', 2], ['10', '15', 2], ['10',
       ...:  '14', 2], ['10', '17', 0], ['10', '16', 3], ['10', '19', 2], ['10', '18', 2], ['1', '20', 3], ['1'
       ...: , '21', 3], ['1', '1', 3], ['1', '0', 0], ['1', '3', 3], ['1', '2', 3], ['1', '5', 4], ['1', '4', 4
       ...: ], ['1', '7', 3], ['1', '6', 3], ['1', '9', 3], ['1', '8', 3], ['1', '11', 3], ['1', '10', 3], ['1'
       ...: , '13', 3], ['1', '12', 3], ['1', '15', 3]]                                                        
    
    In [2]: from collections import defaultdict
    
    In [3]: tree = lambda: defaultdict(tree)
    
    In [5]: adj_mat = tree()
    
    In [6]: for edge in in_list:
       ...:     start, end, weight = edge
       ...:     adj_mat[start][end] = weight
       ...:                                 
    
    In [7]: adj_mat
    Out[7]:        
    defaultdict(<function __main__.<lambda>>,
                {'1': defaultdict(<function __main__.<lambda>>,
                             {'0': 0,                          
                              '1': 3,                          
                              '10': 3,                         
                              '11': 3,                         
                              '12': 3,                         
                              '13': 3,                         
                              '15': 3,                         
                              '2': 3,                          
                              '20': 3,                         
                              '21': 3,                         
                              '3': 3,                          
                              '4': 4,                          
                              '5': 4,                          
                              '6': 3,
                              '7': 3,
                              '8': 3,
                              '9': 3}),
                 '10': defaultdict(<function __main__.<lambda>>,
                             {'0': 3,
                              '1': 2,
                              '10': 2,
                              '11': 2,
                              '12': 2,
                              '13': 2,
                              '14': 2,
                              '15': 2,
                              '16': 3,
                              '17': 0,
                              '18': 2,
                              '19': 2,
                              '2': 2,
                              '20': 2,
                              '21': 2,
                              '3': 2,
                              '4': 3,
                              '5': 3,
                              '6': 2,
                              '7': 2,
                              '8': 2,
                              '9': 2})})
    
    def make_adj_matrix(data, directed=False):
        summary = {}
        result = []
        nodes = []
    
        for start, end, weight in data:
            # store nodes names for further use
            if start not in nodes:
                nodes.append(start)
            if end not in nodes:
                nodes.append(end)
    
            # collect and sum all weights
            summary.setdefault(start, {}).setdefault(end, 0)
            summary[start][end] += weight
            if not directed:
                summary.setdefault(end, {}).setdefault(start, 0)
                summary[end][start] += weight
    
        # # here you can sort your nodes
        # nodes.sort()
    
        # constructing result
        for i in nodes:
            row = []
            for j in nodes:
                row.append(summary.get(i, {}).get(j, 0))
            result.append(row)
    
        return result