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