2010-02-14 7 views
2

Je suis nouveau à python et avoir la pièce suivante du code de test avec une boucle imbriquée et je reçois des listes inattendues générées:liste inattendue apparaissant dans la boucle 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" 

Essentiellement, la liste « recherche » est un couple de chaînes que je cherche à faire correspondre dans certaines molécules et je veux itérer sur les deux chaînes dans chaque molécule contenue dans allmol en utilisant le logiciel pybel. Cependant, le résultat que je reçois est:

['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)] 

[] 

comme prévu, sauf pour quelques listes vides supplémentaires oblongs qui me salit et je ne vois pas où ils viennent. Ils apparaissent après le "\ n" et ne sont donc pas un artefact du smarts.findall(). Qu'est-ce que je fais mal? merci pour toute aide.

+1

non apparentés: déplacer 'llmol = [mole pour mole dans pybel.readfile (« sdf », « zincsdf2mols.sdf.txt »)] de' la boucle. – badp

Répondre

1

allmol a 2 éléments et donc vous êtes en boucle deux fois avec matches étant une liste vide la deuxième fois.

Remarquez comment la nouvelle ligne est imprimée après chaque; le changement que "\n"-"<-- matches" peut éclaircir les choses pour vous:

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

hmm, je ne reçois pas quelque chose ici. Je m'attendais à prendre la première chaîne (CCC) de "search" dans la boucle externe, parcourir toutes les molécules dans allmol dans la boucle interne pour générer une liste de toutes les instances de CCC là-bas, puis revenir à la boucle externe pour ramasser la deuxième chaîne (CCCC) et faire la même chose et générer seulement autant de listes que cela a pris (deux). Je ne vois toujours pas où les supplémentaires sont créés – Shughes

+1

@Shughes: print allmol. Il a une longueur de 2 et c'est pourquoi la boucle 'for b in allmol' itère deux fois par n en recherche. –

0

Peut-être qu'il est censé finir comme ça

for b in allmol: 
    matches.append(smarts.findall(b)) 
print matches, "\n" 

sinon je ne suis pas sûr pourquoi vous initialisez matchs à une liste vide

Si tel est le cas, vous pouvez écrire à la place

matches = [smarts.findall(b) for b in allmol] 
print matches 

une autre possibilité est que le fichier se termine dans une ligne vide

for b in allmol: 
    if not b.strip(): continue 
    matches.append(smarts.findall(b)) 
    print matches, "\n" 
Questions connexes