python中的递归函数

时间:2012-07-12 18:23:45

标签: python function

我有一个文件

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的值来做同样的事情,我试图定义递归函数但不能这样做。

任何帮助都将受到高度赞赏。

提前致谢

1 个答案:

答案 0 :(得分: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])预处理它。