2016-02-26 82 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 –