неожиданный список появляется в цикле Python - PullRequest
1 голос
/ 14 февраля 2010

Я новичок в 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" 

По сути, список "поиск" представляет собой парустроки, которые я ищу, чтобы соответствовать в некоторых молекулах, и я хочу перебрать обе строки в каждой молекуле, содержащейся в allmol, используя программное обеспечение pybel.Тем не менее, результат, который я получаю:

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

2 голосов
/ 14 февраля 2010

allmol имеет 2 элемента, и вы дважды зацикливаетесь, а matches - пустой список во второй раз.

Обратите внимание, как новая строка печатается после каждого; изменение этого значения "\n" на "<-- matches" может помочь вам:

print matches, "<-- matches"
# or, more commonly:
print "matches:", matches
0 голосов
/ 14 февраля 2010

Возможно, это должно закончиться так

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"
...