Метод init; len () объекта self - PullRequest
1 голос
/ 13 декабря 2011
def __init__(self,emps=str(""),l=[">"]):
    self.str=emps
    self.bl=l


def fromFile(self,seqfile):
    opf=open(seqfile,'r')                                       
    s=opf.read()                                              
    opf.close()                                                    
    lisst=s.split(">")                                             
    if s[0]==">":
        lisst.pop(0)                                                    
    nlist=[]
    for x in lisst:
        splitenter=x.split('\n')                                        
        splitenter.pop(0)                                               
        splitenter.pop()                                                
        splitstring="".join(splitenter)                                 
        nlist.append(splitstring)                                       
    nstr=">".join(nlist)                                                
    nstr=nstr.split()
    nstr="".join(nstr)
    for i in nstr:
        self.bl.append(i)
    self.str=nstr
    return nstr

def getSequence(self):
    print self.str
    print self.bl
    return self.str

def GpCratio(self):
    pgenes=[]
    nGC=[]
    for x in range(len(self.lb)):                                   
        if x==">":
            pgenes.append(x)                                           
    for i in range(len(pgenes)):                                        
        if i!=len(pgenes)-1:                                            
            c=krebscyclus[pgenes[i]:pgenes[i+1]].count('c')+0.000       
            g=krebscyclus[pgenes[i]:pgenes[i+1]].count('g')+0.000                                          
            ratio=(c+g)/(len(range(pgenes[i]+1,pgenes[i+1])))
            nGC.append(ratio)                                           
    return nGC  

s = Sequence()
s.fromFile('D:\Documents\Bioinformatics\sequenceB.txt')
print 'Sequence:\n', s.getSequence(), '\n'
print "G+C ratio:\n", s.GpCratio(), '\n'

Я не понимаю, почему выдает ошибку:

in GpCratio     for x in range(len(self.lb)): AttributeError: Sequence instance has no attribute 'lb'. 

Когда я печатаю список в def getSequence, он печатает правильный список секвенированной ДНК, но я не могу использовать этот список для поиска нуклеотидов. Мой университет позволяет мне вводить только 1 файл и не использовать другие аргументы в определениях, а «сам» Кстати, это класс, но он отказывается публиковать его тогда .. класс с именем Sequence


1 Ответ

4 голосов
/ 13 декабря 2011

Похоже на опечатку. Вы определяете self.bl в своей подпрограмме __init__(), затем пытаетесь получить доступ к self.lb.

(Кроме того, emps=str("") является избыточным - emps="" работает так же хорошо.)

Но даже если вы исправите эту опечатку, цикл не будет работать:

for x in range(len(self.bl)):   # This iterates over a list like [0, 1, 2, 3, ...]
    if x==">":                  # This condition will never be True
        pgenes.append(x) 

Вам, вероятно, нужно сделать что-то вроде

pgenes=[]
for x in self.bl:
    if x==">":                  # Shouldn't this be != ?
        pgenes.append(x) 

, который также может быть записан как понимание списка:

pgenes = [x for x in self.bl if x==">"]

В Python вам вряд ли когда-либо понадобится len(x) или for n in range(...); вы скорее итерируете непосредственно по последовательности / итерируемо.

Поскольку ваша программа неполна и в ней отсутствуют примеры данных, я не могу запустить ее здесь, чтобы найти все остальные ее недостатки. Возможно, следующее может указать вам правильное направление. Предполагая строку, содержащую символы ATCG и >:

>>> gene = ">ATGAATCCGGTAATTGGCATACTGTAG>ATGATAGGAGGCTAG"
>>> pgene = ''.join(x for x in gene if x!=">")
>>> pgene
'ATGAATCCGGTAATTGGCATACTGTAGATGATAGGAGGCTAG'
>>> ratio = float(pgene.count("G") + pgene.count("C")) / (pgene.count("A") + pgene.count("T"))
>>> ratio
0.75

Если, однако, вы не хотите смотреть на всю строку, а на отдельные гены (где > - разделитель), используйте что-то вроде этого:

>>> gene = ">ATGAATCCGGTAATTGGCATACTGTAG>ATGATAGGAGGCTAG"
>>> genes = [g for g in gene.split(">") if g !=""]
>>> genes
['ATGAATCCGGTAATTGGCATACTGTAG', 'ATGATAGGAGGCTAG']
>>> nGC = [float(g.count("G")+g.count("C"))/(g.count("A")+g.count("T")) for g in genes]
>>> nGC
[0.6875, 0.875]

Однако, если вы хотите рассчитать содержание GC, то, конечно, вы не хотите (G + C) / (A + T), но (G + C) / (A + T + G + C) - > nGC = [float(g.count("G")+g.count("C"))/len(g)].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...