2016-02-29 112 views
1

我試圖讀取由kewords分隔的文本文件。我正在使用字典來組織與每個部分相對應的信息。例如,對於文本文件:將列表附加到字典

*VERTICES 
1 0 0 
2 10 0 
3 10 10 
4 0 10 
*EDGES 
1 1 2 
2 1 4 
3 2 3 
4 3 4 

*EDGES*VERTICES部分。我的目標是產生就像一本字典:

dict = {'*VERTICES': [[0,0], [0,10], [10,0], [10,10]], '*EDGES': [[1,2], [1,4], [2,3], [3,4]]} 

這是我的代碼:

with open('c:/geometry.txt','r') as inputfile: 
    xyz = [] 
    dic = {} 
    key = None 
    for line in inputfile: 
     line = line.replace(',','') 
     linelist = ' '.join(line.split()) 
     linelist = linelist.split(' ') 
     if(linelist[0][0]=='*'): 
      key = linelist[0] 
      dic[key] = [] 
     else: 
      for i in range(0,len(linelist)): 
       string2float = float(linelist[i]) 
       xyz.append(string2float) 
      dic[key].append(xyz) 
      del xyz[:] 

print(dic) 

這是電流輸出:

{'*VERTICES': [[], [], [], []], '*EDGES': [[], [], [], []]} 

Emtpy,你可以看到。我猜這個錯誤在dic[key].append(xyz)。我做錯了什麼?我注意到,如果我嘗試附加行列表(例如dic[key].append(linelist)),代碼工作正常,但我不會讓我的變量從字符串轉換爲浮動。

有什麼辦法可以讓它與xyz(float)列表一起工作嗎?由於

+0

我不認爲這是有關您當前的問題,而是'你的雙分裂line'變成'linelist'似乎有點傻。爲什麼不使用'linelist = line.split()'並完成它?額外的'join'和'split'完全相反。 – Blckknght

+0

你沒有從你以前的問題得到足夠的:http://stackoverflow.com/questions/35679036/how-to-read-and-organize-text-files-divided-by-keywords。您可以將'linelist'更改爲'list(map(float,linelist))'將它們全部轉換爲浮點。 – AChampion

+0

它們全部爲空的原因是因爲你重複使用了相同的'xyz'列表並刪除了它的內容'del xyz [:]'。只需在'else'塊中創建一個新的'xyz = []''。 – AChampion

回答

1

你的代碼的最後一個行不會做你希望他們做的事:

 dic[key].append(xyz) 
     del xyz[:] 

要追加一個關於你xyz列表,在字典中的列表中,但你」重新列表清單的內容。該片上的del語句就地修改了該列表,因此存儲在字典中的引用也將看到之後的空列表結果。

實際上,詞典中所有空的內部列表都是對同一個空xyz列表的引用。你可能想要做的是,真正的xyz創建一個新的列表,而不是刪除的內容:

 dic[key].append(xyz) 
     xyz = [] 

或者,更好的是,使用列表理解來構建其內容的新名單,擺脫在xyz變量完全:

else: 
     dic[key].append([float(num) for num in linelist]) 

注意,這將包括在內部字典文件的所有三個值。如果你只需要兩個,你可能想要分割linelist

+0

是的,這是問題所在。謝謝! –

0

它看起來像你大大過度複雜這一點。你的代碼非常難以遵循,部分原因是因爲變量名稱很模糊(什麼是xyz?)。 @Blckknght正確地確定了程序中的錯誤原因。 (事實上​​,我給他/她一個給予好評)。我可以在這裏做出貢獻的唯一事情是一些工作代碼:

d = {} 

with open('c:/geometry.txt','r') as f: 
    for line in f: 
     if line.startswith('*'): 
      key = line.strip() 
      d[key] = [] 
     else: 
      d[key].append(map(int, line.split()[1:])) 
+0

我想我可以使用更好的變量名稱。額外的(分裂和加入)在那裏,因爲在原始文本文件中,我也有逗號和重複空格,我想擺脫它們。我幾乎可以確定有更好的方法,但我只是從Python開始。謝謝你的評論! –