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

я должен получить результат, как: графа = { "а": [ "б"], "б": [ "а"], "с": [ "d"], "d": [ "с"]}

спасибо заранее

ответ

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, в этом случае вам не нужно будет инициализировать d с np.unique. Он также защитит от ошибок, которые в противном случае возникли бы, когда узел появился только во втором столбце.

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]) дает мне ошибку. (KeyErroe: 754') – Arslan

+0

Я предполагаю, что происходит, когда появляется во второй колонке в "754" ваши данные, но не первые. Я думаю, вы могли бы сделать d = {i: [] для i в np.unique (dat [:, 0]) + np.unique (dat [:, 1])} ', но с использованием defaultdict было бы проще. Ред. – Kevin

Смежные вопросы