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

allmol有 2 个项目,所以你循环两次,matches第二次是一个空列表。

注意每个换行符是如何打印的;将其更改"\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 回答