1

私はPythonを初めて使用し、ネストされたループを特徴とする次のテストコードを持っており、予期しないリストが生成されています:

import pybel  
import math  
import openbabel  
search = ["CCC","CCCC"]  
matches = []  
#n = 0  
#b = 0  
print search  
for n in search:  
    print "n=",n  
    smarts = pybel.Smarts(n)  
    allmol = [mol for mol in pybel.readfile("sdf", "zincsdf2mols.sdf.txt")]  
    for b in allmol:  
        matches = smarts.findall(b)  
        print matches, "\n" 

基本的に、リスト「検索」は、いくつかの分子で一致させようとしているいくつかの文字列であり、pybel ソフトウェアを使用して allmol に含まれるすべての分子の両方の文字列を反復処理したいと考えています。しかし、私が得る結果は次のとおりです。

['CCC', 'CCCC']  
n= CCC  
[(1, 2, 28), (1, 2, 4), (2, 4, 5), (4, 2, 28)]   

[]   

n= CCCC  
[(1, 2, 4, 5), (5, 4, 2, 28)]   

[]   

私を台無しにしていて、それらがどこから来ているのかわかりません。これらは "\n" の後に表示されるため、smarts.findall() のアーティファクトではありません。私は何を間違っていますか?助けてくれてありがとう。

4

2 に答える 2

2

allmol2つのアイテムがあるためmatches、2回目は空のリストで2回ループしています。

それぞれの後に改行がどのように出力されるかに注意してください。それをに変更すると、問題が解決"\n"する"<-- matches"場合があります。

print matches, "<-- matches"
# or, more commonly:
print "matches:", matches
于 2010-02-14T19:58:59.923 に答える
-1

たぶんこのまま終わるはず

for b in allmol:  
    matches.append(smarts.findall(b))  
print matches, "\n"

そうしないと、一致を空のリストに初期化する理由がわかりません

その場合は、代わりに書くことができます

matches = [smarts.findall(b) for b in allmol]
print matches

別の可能性は、ファイルが空の行で終わっていることです

for b in allmol:  
    if not b.strip(): continue
    matches.append(smarts.findall(b))  
    print matches, "\n"
于 2010-02-14T20:53:45.097 に答える