2014-12-04 242 views
1

我有一個文本文件邊緣的名單列表:圖中從邊緣

0 1 
0 2 
0 3 
1 637 
1 754 
1 1319 
1 1350 
1 1463 
1 1523 
2 637 
2 754 
2 1319 
2 1350 
2 1463 
2 1523 
3 499 
3 539 
3 595 
3 637 
3 706 
3 1128 
3 1194 
3 1213 
3 1319 
.. ... 

我需要把它變成像這樣的詞典:

graph = { "a" : ["c"], 
     "b" : ["c", "e"], 
     "c" : ["a", "b", "d", "e"], 
     "d" : ["c"], 
     "e" : ["c", "b"], 
     "f" : [] 
    } 

我嘗試這樣遠一直是:

import numpy as np 
file_name='/Volumes/City_University/data_mining/Ecoli.txt' 
key_column=0 

dat=np.genfromtxt(file_name,dtype=str) 
d={i:[] for i in np.unique(dat[:,key_column])} 

for row in dat: 
    for key in d.keys(): 
     if row[key_column]==key :d[key].append(row[1]) 

print (d) 

但是,這不能正常工作,因爲我不會得到一個新的關鍵,當它出現在值中:作爲一個例子 我得到:

'0': ["1", "2", "3"] 
'1': ['637', '754', '1319', '1350', '1463', '1523'] 

在'1'中,「0」丟失。

使其更簡單。如果我有這樣

a b 
c d 

文本,我應該得到這樣一個結果: 圖= { 「一」: 「B」], 「B」: 「一」], 「C」: 「d」], 「d」: 「C」]}如果你想有一個雙向圖

預先感謝您

回答

2

,需要兩個附加。

此外,您並不需要for key in d.keys()循環,只需附加到d[row[0]]而不是d[key]

for row in dat: 
    d[row[0]].append(row[1]) 
    d[row[1]].append(row[0]) 

而且,考慮使用defaultdict,在這種情況下,你不會需要np.unique初始化d。它還將防止在節點僅出現在第二列時發生的錯誤。

import numpy as np 
from collections import defaultdict 

file_name='/Volumes/City_University/data_mining/Ecoli.txt' 
dat=np.genfromtxt(file_name,dtype=str) 
d=defaultdict(list) 

for row in dat: 
    d[row[0]].append(row[1]) 
    d[row[1]].append(row[0]) 

print (d) 
+0

線d [行[1]]追加(行[0])給我一個錯誤:當 「754」 出現在在第二列(754' KeyErroe) – Arslan 2014-12-04 13:38:41

+0

我猜測,發生你的數據,但不是第一個。我認爲你可以在np.unique(dat [:,0])+ np.unique(dat [:,1])}'中爲'i做'd = {i:[],但使用defaultdict會更容易。編輯。 – Kevin 2014-12-04 13:44:09