【问题标题】:unexpected list appearing in python looppython循环中出现意外列表
【发布时间】:2011-01-16 18:40:04
【问题描述】:

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

【问题讨论】:

  • 无关:将llmol = [mol for mol in pybel.readfile("sdf", "zincsdf2mols.sdf.txt")]移出循环。

标签: python list for-loop openbabel


【解决方案1】:

allmol 有 2 个项目,因此您循环了两次,而 matches 第二次是一个空列表。

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

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

【讨论】:

  • 嗯,我没有得到任何东西。我希望它从外循环中的“搜索”中获取第一个字符串(CCC),遍历内循环中 allmol 中的所有分子以生成其中所有 CCC 实例的列表,然后返回到外循环拿起第二个(CCCC)字符串并执行相同的操作并仅生成与此一样多的列表(两个)。我仍然看不到在哪里创建了额外的
  • @Shughes:打印 allmol。它的长度为 2,这就是 for b in allmol 循环在搜索中每 n 迭代两次的原因。
  • 4 个 findalls -> 4 个输出。很明显。
【解决方案2】:

或许就该这样结束

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"

【讨论】:

  • 他初始化为一个空列表,因为他是“python 新手”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-02
  • 1970-01-01
  • 1970-01-01
  • 2019-04-04
  • 2018-08-04
  • 2022-11-28
相关资源
最近更新 更多