只获得一个结果而不是多个结果

时间:2016-01-29 19:07:34

标签: python python-2.7

程序

f=open('something.txt'.'r')
lines=f.readlines()
for read in range(0,len(lines)):
    c=lines[read]
    d=lines[read]
    if c[0:4]=='ATOM':
        AX1=float(c[32:38])
        AY1=float(c[40:46])
        AZ1=float(c[48:54])
        A1=c[77]
    if d[0:6]=='HETATM':
        HX1=float(d[32:38])
        HY1=float(d[40:46])
        HZ1=float(d[48:54])
        H1=d[77]
    distance=math.sqrt((HX1-AX1)**2+(HY1-AY1)**2+(HZ1-AZ1)**2)
    print 'Distance b/w ',A1,' and ',H1,'',distance

文件将如下:

ATOM      1  N   ALA A   4      15.660  74.786  38.080  1.00 29.54           N  
ATOM      2  CA  ALA A   4      15.546  74.666  39.526  1.00 27.64           C  
ATOM      3  C   ALA A   4      16.833  74.137  40.145  1.00 25.88           C  
ATOM      4  O   ALA A   4      17.852  73.890  39.500  1.00 24.05           O  
.
.
.
ATOM   6048  OXT ALA A 780      21.816  67.407  16.290  1.00 13.41           O  

HETATM 6050  C1  GLC A2002       5.415  71.753  22.098  1.00 21.40           C  
HETATM 6051  C2  GLC A2002       3.948  71.252  22.308  1.00 21.24           C  
HETATM 6052  C3  GLC A2002       3.065  71.966  21.254  1.00 20.81           C  
HETATM 6053  C4  GLC A2002       3.266  73.512  21.425  1.00 20.10           C  
HETATM 6054  C5  GLC A2002       4.737  73.893  21.253  1.00 21.47           C  
HETATM 6055  C6  GLC A2002       4.967  75.396  21.466  1.00 22.53           C  
HETATM 6056  O1  GLC A2002       6.224  71.231  23.190  1.00 22.04           O  
HETATM 6057  O2  GLC A2002       3.902  69.831  22.018  1.00 21.46           O  
HETATM 6058  O3  GLC A2002       1.682  71.659  21.493  1.00 21.68           O  
HETATM 6059  O4  GLC A2002       2.509  74.212  20.404  1.00 17.87           O  
HETATM 6060  O5  GLC A2002       5.516  73.179  22.244  1.00 21.76           O  
HETATM 6061  O6  GLC A2002       6.361  75.746  21.230  1.00 24.18           O  

我想使用上面提到的公式计算值。它应该将ATOM-1与所有HETATM和ATOM-2进行比较,然后继续进行。

但是我只得到了最后一个ATOM和所有HETATM的结果

结果

Distance b/w  O  and  C  17.9335824921
Distance b/w  O  and  C  19.2422912617
Distance b/w  O  and  C  19.925505715
Distance b/w  O  and  C  20.1926162247
Distance b/w  O  and  C  18.9312388924
Distance b/w  O  and  C  19.3521031932
Distance b/w  O  and  O  17.4740790888
Distance b/w  O  and  O  18.963047118
Distance b/w  O  and  O  21.2256606258
Distance b/w  O  and  O  20.8804518629
Distance b/w  O  and  O  18.2881409662
Distance b/w  O  and  O  18.2427943583

1 个答案:

答案 0 :(得分:2)

问题在于此块:

lines=f.readlines()
for read in range(0,len(lines)):
    c=lines[read]
    d=lines[read]

您只需循环一次,并且一次将cd分配到同一行。

相反,您希望为c循环一次,为d循环一次。更加pythonic的方法是直接在lines而不是range(0, len(lines))上循环。

lines=f.readlines()
for c in lines:
    for d in lines:
        # the rest of your code

另外,正如Ryan所指出的那样,当您没有匹配时,您没有对A1H1执行任何操作,因此您可能无意中比较了之前循环中的旧数据。请务必跳过这些情况,可能是在continue失败后的else语句中使用if

if c[0:4]=='ATOM':
    AX1=float(c[32:38])
    AY1=float(c[40:46])
    AZ1=float(c[48:54])
    A1=c[77]
else:
    continue