2017-04-18 134 views
0

我試圖通過讀取.txt文件以這種格式在Python中創建一個鄰接表的字典:如何閱讀txt文件,並創建鄰接表Python字典

1 2 
1 3 
1 10 
2 3 
4 5 
4 6 
4 10 
5 6 
7 8 
7 9 
7 10 
8 9 

我想要得到的解釋是

adjacency_list_dict = {[1]:{[2,3,10],[2]:這個格式的[1,3],...}等

注意的是,儘管看上去像一個定向圖中,它實際上是無向的,並且字典中每個鍵的列表值必須包含所有相鄰節點例如[10]:[1,4,7]儘管10不在任何txt文件行的第一列。

現在我堅持這個代碼塊:

# Main file for assignment 2 
input_filename = "example_graph_1.txt" 
def create_teams(): 
    return [] 
def create_lex(): 
    return {} 
def make_to_list(node): 
    return [node] 

teams = create_teams() 
adjacency_graph = create_lex() 

with open(input_filename) as graph_input: 
    for line in graph_input: 
     nodes = [int(x) for x in line.split()] 
     for i in nodes: 
      if make_to_list(i) not in teams: 
       teams.append(make_to_list(i)) 
      if i not in adjacency_graph: 
       adjacency_graph[i] = create_teams() 
    print adjacency_graph 
    print teams 

請忽略所有其他變量,字典adjacency_graph是我很關心。 :)

我應該如何進行?

+0

你有一些代碼可以顯示嗎? – Astrom

+0

將其分解成更小的部分。首先打開文件並打印每一行。然後從那裏出發。 –

+0

@Astrom heloo,請再看看,我編輯的帖子,我希望它可以幫助:) – Marios

回答

3

您可以通過使用.setdefault和拆分來完成此操作。基本上,如果未定義,代碼將在密鑰parts[0]上創建一個新列表。之後,我們追加到列表中。

di = {} 

with open("file.txt", "r") as fi: 
    for line in fi: 
     parts = line.split() 
     di.setdefault(parts[0],[]).append(parts[1]) 

print(di) 

並使其雙向的最簡單方法是附加字典兩種方式:

di = {} 

with open("file.txt", "r") as fi: 
    for line in fi: 
     parts = line.split() 
     di.setdefault(parts[0],[]).append(parts[1]) 
     di.setdefault(parts[1],[]).append(parts[0]) 

print(di) 
+0

就像那樣! – Astrom

+0

@Jammeth_Q感謝您的輸入,我更新了答案。 – Neil

1
import numpy 

l1, l2 = numpy.genfromtxt('t.txt', dtype='float').T 
uniques = list(numpy.unique(l1))+list(numpy.unique(l2))  
dic = {} 

for i in numpy.unique(uniques): 
    a =list(l2[numpy.where(l1 == i)[0]]) 
    b =list(l1[numpy.where(l2 == i)[0]]) 

    c = list(numpy.unique(a+b)) 
    dic[i] = c 

輸出: {1.0:[2.0,3.0,10.0],2.0:[ 1.0,0.0,3.0] 3.0:[1.0,2.0],4.0:[5.0,6.0,10.0],5.0:[4.0,6.0],6.0:[4.0,5.0],7.0:[8.0,9.0,10.0],8.0 :[7.0,9.0],9.0:[7.0,8.0],10.0:[1.0,4.0,7.0]}