出现在python循环中的意外列表

时间:2010-02-14 19:53:26

标签: python list for-loop openbabel

我是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()的人工制品。我究竟做错了什么? 谢谢你的帮助。

2 个答案:

答案 0 :(得分:2)

allmol有两个项目,因此您第二次将matches作为空列表循环两次。

注意每行后如何打印换行符;将"\n"更改为"<-- matches"可能会为您解决问题:

print matches, "<-- matches"
# or, more commonly:
print "matches:", matches

答案 1 :(得分:-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"