-3

我有一个文件

A      1  N   MET P   1      27.340  24.430   2.614  
A      2  HT1 MET P   1      26.953  23.623   2.168  
A      3  CB  MET P   1      27.740  24.175   3.494  
A      4  H   MET P   1      28.039  24.841   2.028  
A      5  CA  MET P   1      26.266  25.413   2.842  
A      6  HA  MET P   1      25.880  25.742   1.885  
A      7  C   MET P   1      25.112  24.880   3.649  
A      8  HB1 MET P   1      24.236  25.536   3.434 
...   ... ... ... .  ...     .....    .....   .....

作为代码的一部分,我将获取文件第二列的值并取该值,我需要减小它的值,直到第三列字符串应该是元素之一list=['C','N','O']并附加 6、7、8 的值一旦条件得到满足,列表和循环的列值就会中断(因为第三列中的字符串是递归的)我已经尝试过这种方式:注意:atom_no是第二列值和 rl1-readlines

dec=int(atom_no)-1
for i in range(0,1231):
       dec=dec-1
       list_coor1=[]
       line1=rl1[i]
       line1=line1.split()
       if len(list_coor1)==0:
          if line1[1]==str(dec):
             for atom in list:
                  if line1[2]==str(atom):
                     for p in range(6,9):
                        list_coor1.append(line1[p])
                        print list_coor1

我无法成功我确实认为减小值是有问题的,即,dec=dec-1 因为我打算通过增加 的值来做同样的事情atom_no,所以我试图定义递归函数但无法做到。

任何帮助将不胜感激。

提前致谢

4

1 回答 1

0

如果我正确理解您的问题,您将尝试在文件中找到第三列中包含 C、N 或 O 的最后一行,并返回该行中第 7 列到第 9 列的值。

如果您使用 Python 内置的功能,例如迭代和成员检查,这很简单。您的代码使用额外的 if 语句和循环使其变得比必要的复杂得多。

def findLastMatch(lines, startNum, elements):
    for i in range(startNum-1, -1, -1): # iterate backwards from startNum-1
        values = lines[i].split(); # split up the line into columns
        if values[2] in elements:  # does column 3 matches one of the elements?
            return values[-3:]     # if so, return the last three columns
    return None # if we got here, there was no match

如果您需要进行错误检查(因为您的数据文件可能有错误的行),它可能会变得更复杂一些,但可能不会太多。只有一个循环,因此给定行的任何问题都可以通过调用continue转到下一行来传递。如果元素列表的格式不正确(包含字符串),您可以在调用代码中或在此函数的顶部(例如elements = [str(e) for e in elements])对其进行预处理。

于 2012-07-12T18:56:26.977 回答