2010-02-14 26 views
2

我是新来的蟒蛇,并有下面的一段测试代码设有一个嵌套的循环,我如何产生一些意想不到的列表:出现在蟒蛇循环意想不到的列表

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

+1

相依:移动'llmol = [摩尔用于pybel.readfile(“SDF”,“zincsdf2mols.sdf.txt”)摩尔]'出的循环。 – badp 2010-02-14 20:52:57

回答

1

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

请注意换行符是如何在每个之后打印的;改变这种"\n""<-- matches"可以澄清一些事情你:

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

嗯,我没有在这里得到什么。我期待它从外部循环中的“搜索”中取出第一个字符串(CCC),遍历内部循环中allmol中的所有分子以生成CCC中所有CCC实例的列表,然后返回到外部循环拿起第二个(CCCC)字符串并执行相同的操作,并只生成与此相同的许多列表(两个)。我仍然没有看到额外的创建地点 – Shughes 2010-02-14 20:20:19

+1

@Shughes:print allmol。它的长度为2,这就是为什么在allmol循环中'for b在搜索中每n次迭代两次。 – 2010-02-14 20:25:04

0

也许它应该就这样结束

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"