Форум » Обработка символьных строк » 6526 » Ответить

6526

Ельцова: Здравствуйте, не сходится с ответом решение ниже [pre2]a = open('24-259.txt').readline() a=a.split('TAA') m=-1 for i in range(len(a)): w=a if len(w)>=3 and w[0:3]=='ATG' and not 'TAA' in w and not 'TGA' in w and not 'TAG' in w: m=max(m,len(w)+3) print(m)[/pre2] Может быть недопонимаю условие? Подскажите

Ответов - 5

Marigood: Вы не рассматриваете ситуацию, когда ATG не в начале w. Т.е. правильнее искать в строках первое вхождение ATG и проверять, что TGA и TAG не встречаются в срезе. И ещё момент. Когда разбили строку по TAA, то строки вида TAATG.... "испортились", в начале строки А пропала. Т.е. надо учесть строки, начинающиеся на TG [pre2] a = open('24-259.txt').readline() a = a.split('TAA') m = -1 for w in a: i = w.find('ATG') if i != -1 and 'TGA' not in w[i:] and 'TAG' not in w[i:]: m = max(m, len(w) - i + 3) if w[:2] == 'TG' and 'TGA' not in w and 'TAG' not in w: m = max(m, len(w) - i + 4) print(m) [/pre2] Этот код выдаёт ответ 80

Marigood: Так тоже получается 80: [pre2] a = open('24-259.txt', 'r').readline() mk = 0 k = 0 for i in range(len(a) - 2): if a[i:i+3] == 'ATG': k += 1 elif a[i:i+3] == 'TAA': mk = max(mk, k + 3) k = 0 elif a[i:i+3] == 'TGA' or a[i:i+3] == 'TAG': k = 0 elif k > 0: k += 1 print(mk) [/pre2] Ошибка в ответах? Или мы ошибаемся в решениях?

Ж: У вас не учтен вариант, когда внутри строки встречается комбинация ATG. И когда комбинация TGA идет к примеру со второй позиции (ей там быть можно) Прогоните на строке a='ATGATGTAA' С доработкой код выдает верный ответ. [pre2] a=open('c:/24-259.txt').readline() mk = 0; nach=True; k=0 for i in range(len(a) - 2): if nach and a[ i:i + 3] == 'ATG': nach=False; k+=1 if not nach: k += 1 if k > 3 and (a[ i:i + 3] == 'TGA' or a[ i:i + 3] == 'TAG'): k = 0 if a[ i:i + 3] == 'TAA': mk = max(mk, k + 3) k = 0 print(mk) [/pre2]


Ельцова: У меня получилось больше, учла все вхождения ATG, которые могут быть внутри подстроки, проверила в файле, действительно, данная подстрока длины 135 (ATGTGCTGGAATGCCCGCATTCGCGAAACAGTCCAGCAGCGCCGTCCGATGATCTCGGCTGCATCAGTTCTCGAGCAAAAATGGCATGCGAAATGTCGATACATACACAGCGACCCTACTATGGATCAAGGCTAA) есть в файле и удовлетворяет условию. Код [pre2] a = open('24-259.txt').readline() a=a.replace('ATG','@') a=a.replace('TAA','*') ma=-1 while len(a)>0: if a.count('@')>0 and a.count('*')>0: ind1=a.index('@') ind2=a.index('*') s=a[ind1+1:ind2] if s.count('TGA')==0 and s.count('TAG')==0: le=len(s)-s.count('@')+s.count('@')*3 ma=max(ma,le+6) a=a[ind2+1:] else: break print(ma)[/pre2]

Ж: Делая замену a=a.replace('ATG','@') , вы не сможете поймать некоторые вхождения TGA В вашей цепочке именно по этой причине есть комбинация TGA ATGTGCTGGAATGCCCGCATTCGCGAAACAGTCCAGCAGCGCCGTCCGATGATCTCGGCTGCATCAGTTCTCGAGCAAAAATGGCATGCGAAATGTCGATACATACACAGCGACCCTACTATGGATCAAGGCTAA [pre2] s = open('d:/24-259.txt').readline() l=[0] for i in range(len(s)): j=i+max(l)+1 while j<=len(s): ss=s[i:j] if ss[:3]=='ATG' and ss[-3:]=='TAA' and ss[3:-3].count('TAA')==0 and ss[3:-3].count('TGA')==0 and ss[3:-3].count('TAG')==0: l.append(len(ss)) print(max(l),ss) elif ss[-3:]=='TAA': break j+=1 [/pre2]



полная версия страницы