2016-07-02 81 views
-3

私のような隣接行列持っている:私がダウンしてここにこのような隣接リストに変換することができますどのよう隣接行列をPythonで隣接リストに変換するには?

[[ 0., 15., 0., 7., 10., 0.], 
    [ 15., 0., 9., 11., 0., 9.], 
    [ 0., 9., 0., 0., 12., 7.], 
    [ 7., 11., 0., 0., 8., 14.], 
    [ 10., 0., 12., 8., 0., 8.], 
    [ 0., 9., 7., 14., 8., 0.]] 

を?

graph = {'1': [{'2':'15'}, {'4':'7'}, {'5':'10'}], 
'2': [{'3':'9'}, {'4':'11'}, {'6':'9'}], 
'3': [{'5':'12'}, {'6':'7'}], 
'4': [{'5':'8'}, {'6':'14'}], 
'5': [{'6':'8'}]} 

+0

隣接行列が完全に空に見えます。それはどのようにして 'graph'データになるでしょうか? –

+0

@StefanPochmannオリジナルの改訂版があります。マトリックス。私はOPの最近の編集をロールバックしなければならなかった。なぜ元の行列を消したのではないのですか? –

答えて

2

すでに追加されているエッジのリストをセットedgesに保存します。これらのエッジはfrozensetに格納されているため、すでに追加されたペアは複製されません。


そして、1の開始インデックスと外側のリスト、また1の開始インデックスとその後、内側のリストを列挙して、グラフを構築します。ゼロ値のエントリは、値にif条件で除去されています

from collections import defaultdict 
from pprint import pprint 

l =[[ 0., 15., 0., 7., 10., 0.], 
    [ 15., 0., 9., 11., 0., 9.], 
    [ 0., 9., 0., 0., 12., 7.], 
    [ 7., 11., 0., 0., 8., 14.], 
    [ 10., 0., 12., 8., 0., 8.], 
    [ 0., 9., 7., 14., 8., 0.]]  

graph = defaultdict(list) 
edges = set() 

for i, v in enumerate(l, 1): 
    for j, u in enumerate(v, 1): 
     if u != 0 and frozenset([i, j]) not in edges: 
      edges.add(frozenset([i, j])) 
      graph[i].append({j: u}) 

pprint(graph) 
# {1: [{2: 15.0}, {4: 7.0}, {5: 10.0}], 
# 2: [{3: 9.0}, {4: 11.0}, {6: 9.0}], 
# 3: [{5: 12.0}, {6: 7.0}], 
# 4: [{5: 8.0}, {6: 14.0}], 
# 5: [{6: 8.0}]} 

オンザフライでリスト値の辞書の構築を支援しますデフォルト値としてlistをとるdefaultdictを使用します。

+0

ありがとうございました@MosesKoledoye、それは私が欲しかった! – killx1997

関連する問題