2014-12-04 130 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