Похоже на опечатку. Вы определяете 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)]
.