我有一个文件
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
的值来做同样的事情,我试图定义递归函数但不能这样做。
任何帮助都将受到高度赞赏。
提前致谢
答案 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]
)预处理它。