2016-02-26 117 views
0

解析多維名單,我有以下的文本文件 - http://www.ncbi.nlm.nih.gov/Class/FieldGuide/BLOSUM62.txt形成與蟒蛇

我需要一個Python代碼給我矩陣的特定條目。我使用多維列表,並希望不使用python中的numpy庫。我的意圖是在列表內部形成列表,其中外(主)列表包含矩陣的行,而內列表包含矩陣的單元格。

我使用以下代碼 -

handle=open(fname) 
li=[] 
matrix=[] 
for line in handle: 
     if not line.startswith('#'): 
      a=line.split() 
      for i in a: 
        li.append(i) 
        matrix.append(li) 
print matrix 

然而,這只是返回其中每個元素的矩陣的一個單元的一名維列表。我迷失於如何解決這個問題。輸出應該是這個形式 -

[['A', 'R', 'N', 'D', 'C', 'Q', 'E', 'G', 'H', 'I', 'L', 'K', 'M', 'F', 'P', 'S', 'T', 'W', 'Y', 'V', 'B', 'Z', 'X', '*'], 
['A', '4', '-1', '-2', '-2', '0', '-1', '-1', '0', '-2', '-1', '-1', '-1', '-1', '-2', '-1', '1', '0', '-3', '-2', '0', '-2', '-1', '0', '-4']] 

回答

0

你沒有得到你想要的,因爲你把所有的值到同一個li列表中的結果。對於這個問題,最簡單的解決方法是簡單地創建li的地方移動到循環:

handle=open(fname) 
matrix=[] 
for line in handle: 
     if not line.startswith('#'): 
      li=[]     # move this line down! 
      a=line.split() 
      for i in a: 
        li.append(i) 
        matrix.append(li) 
print matrix 

內環還有一個有點傻,但。您將所有值從一個列表(a)添加到另一個列表(li),然後丟棄第一個列表。你應該只使用由str.split直接返回的列表:

+0

這只是給了我一噸的垃圾產量。我使用內部循環的意圖是第一個列表應該包含單元格元素,第二個列表應該是每行的這些單元格元素的列表。 –

+0

我想我不明白你想要什麼。你能編輯問題來顯示所需的輸出嗎? – Blckknght

+0

這是否使問題更清晰? @Blckknght –

1

我想你想製作一個矩陣,例如矩陣[0] [1]指的是價值,不是嗎?請參閱以下代碼。

handle=open(fname) 
matrix=[] 
col={} 
idx=0 
row={} 
idr=0 
# get 1st line as column 
first_line=0 
for line in handle: 
    if not line.startswith('#'): 
     if first_line == 0: 
      first_line=1 
      # get column header 
      for i in line.split(): 
       col[i]=idx 
       idx=idx+1 
     else: 
      a = line.split() 
      x = a.pop(0) 
      # get row name 
      row[x]=idr 
      matrix.append(a) 
      idr=idr+1 
print matrix 
print matrix[col['A']][row['A']] 

看看這是你想要的。

+0

這正是我想要的。非常感謝@Ronald –