-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 
...   ... ... ... .  ...     .....    .....   .....

コードの一部として、ファイルの 2 列目の値を取得し、その値を取得して、3 列目の文字列が の要素の 1 つになるまでその値を減らしlist=['C','N','O']、6、7、8 の値を追加する必要があります。リストへの列の値とループは、条件が満たされるとすぐに中断する必要があります (3 列目の文字列は再帰的であるため) 私はこの方法を試しました:注: atom_no2 番目の列の値と 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

私があなたの質問を正しく理解していれば、列 3 に 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

エラー チェックを行う必要がある場合 (データ ファイルに不正な行が含まれている可能性があるため) は、もう少し複雑になる可能性がありますが、それほど多くはありません。ループは 1 つだけなので、特定の行の問題continueは次の行に進むように呼び出すことで無視できます。要素リストが適切にフォーマットされていない (文字列を含む) 場合は、呼び出し元のコードで、またはこの関数の先頭で (eg を使用してelements = [str(e) for e in elements]) 前処理できます。

于 2012-07-12T18:56:26.977 に答える