2016-05-31 2 views
0

Учитывая эту строкуПытаясь найти подстроки в строке большой

dna3 = "CATGTAATAGATGAATGACTGATAGATATGCTTGTATGCTATGAAAATGTGAAATGACCC" 

следующий код должен напечатать следующие 4 подстроки.

ATGTAA 
ATGAATGACTGATAG 
ATGCTATGA 
ATGTGA 

Однако печать следующее:

ATGTAA 
ATGAATGACTGATAG 
ATGACTGATAGATATGCTTGTATGCTATGAAAATGTGAAATGACCC 
ATGCTTGTATGCTATGAAAATGTGAAATGACCC 
ATGCTATGA 
ATGAAAATGTGA 
ATGTGA 
ATGACCC 
None 

Может кто-то пожалуйста, помогите мне понять это. Спасибо.

def findStopIndex(dna,index): 

    stop1 = dna.find("tga",index) 
    if(stop1 == -1 or (stop1-index) % 3 != 0): 
     stop1 = len(dna) 

    stop2 = dna.find("taa",index) 
    if(stop2 == -1 or (stop2-index) % 3 != 0): 
     stop2 = len(dna) 

    stop3 = dna.find("tag",index) 
    if(stop3 == -1 or (stop3-index) % 3 != 0): 
     stop3 = len(dna) 

    return min(stop1, min(stop2,stop3)) 

def printAll(dna): 
    gene = None 
    start = 0 
    while(True): 
     loc = dna.find("atg", start) 
     if(loc == -1):break 
     stop = findStopIndex(dna,loc+3) 
     gene = dna[loc:stop+3] 
     print gene.upper() 
     start = loc + 3 


print printAll(dna3.lower()) 
+0

Для отладки это я бы напечатать значения индекса, Окончание1, STOP2 и STOP3. Я подозреваю, что вы увидите, что один из значений не тот, который вы ожидаете. –

+0

'min' может использоваться с несколькими аргументами:' min (stop1, stop2, stop3) '. – Daniel

+0

'if' и' while' не являются функциями, поэтому скобки не нужны. – Daniel

ответ

0

Нам может потребоваться некоторая дополнительная информация о структуре ДНК. Из того, что вы описали, похоже, что подстроки не могут пересекаться друг с другом. В этом случае вам необходимо заменить start = loc + 3 на start = stop + 3 (символы, похоже, сгруппированы по 3, также основаны и описаны вами).

Наконец, вам не нужен print в print printAll(dna3.lower()), так как он показывает None в конце вашего результирующего набора (функция не имеет возвращаемого значения).

С этими изменениями, мой вывод:

ATGTAA 
ATGAATGACTGATAG 
ATGCTTGTATGCTATGAAAATGTGAAATGACCC 

Надеется, что это будет полезно.

+0

Он хочет найти все подстроки. Если вы выполняете 'start = stop + 3', вы пропустите некоторые подстроки – qvpham

+0

@julivico. Возвращаемый стоп-индекс является индексом ** первого символа ** из 3-х символьной группы, поэтому my +3. Вот почему он печатает 'dna [loc: stop + 3]'. – 3kt

+0

Посмотрите на выход 'ATGAATGACTGATAG'. В этой строке есть 'ATG'. Если вы используете 'stop + 3', вы пропустите его. – qvpham

0

изменение:

1) мин следует использовать "ключ = INT" в противном случае вид будет сделан в виде строки ...

return min(stop1,stop2,stop3, key=int) 

2) перерыв был заменен с выходом, чтобы избежать другой цикл с while

1

Я думаю, вы могли бы объяснить это немного лучше, но чтобы получить то, что вы хотите получить, вы не можете вернуть мин так, или когда вы это делаете, вам придется относиться к нему иначе. Длинные цепи, которые вы получаете, - это то, что вы возвращаете «60», что является длиной всей последовательности. Я немного изменил код, и он только подбирает последовательности, которые заканчиваются на одном из «tga», «taa» или «tag».

def findStopIndex(dna, index): 
    stop1 = dna.find("tga", index) 
    if (stop1 == -1 or (stop1 - index) % 3 != 0): 
     stop1 = len(dna) 
    stop2 = dna.find("taa", index) 
    if (stop2 == -1 or (stop2 - index) % 3 != 0): 
     stop2 = len(dna) 
    stop3 = dna.find("tag", index) 
    if (stop3 == -1 or (stop3 - index) % 3 != 0): 
     stop3 = len(dna) 
    end_sequence = min(stop1, stop2, stop3)if min(stop1, stop2, stop3) < 60 else None 
    return end_sequence 

def printAll(dna): 
    start = 0 
    while True: 
     loc = dna.find("atg", start) 
     if loc == -1: 
      break 
     stop = findStopIndex(dna, loc + 3) 
     if stop: 
      gene = dna[loc:stop+3] 
      print(gene.upper()) 
     start = loc + 3 
    return 

printAll(dna3.lower()) 

Выходов:

ATGTAA 
ATGAATGACTGATAG 
ATGCTATGA 
ATGAAAATGTGA 
ATGTGA 
+0

, удалите 'print' в' print (printAll (dna3.lower())) 'будет удалять выход' None'. Функция 'printAll' ничего не возвращает (или None). – qvpham

+1

@julivico: Да, я увидел ответ 3kt, а затем он ударил меня тоже. Благодаря! –

0

начало изменения = LOC + 3 к старт = LOC + Len (ген) + 3

def findStopIndex(dna,index): 

    stop1 = dna.find("tga",index) 
    if(stop1 == -1 or (stop1-index) % 3 != 0): 
     stop1 = len(dna) 

    stop2 = dna.find("taa",index) 
    if(stop2 == -1 or (stop2-index) % 3 != 0): 
     stop2 = len(dna) 

    stop3 = dna.find("tag",index) 
    if(stop3 == -1 or (stop3-index) % 3 != 0): 
     stop3 = len(dna) 

    return min(stop1, min(stop2,stop3)) 

def printAll(dna): 
    gene = None 
    start = 0 
    while(True): 
     loc = dna.find("atg", start) 
     if(loc == -1):break 
     stop = findStopIndex(dna,loc+3) 
     gene = dna[loc:stop+3] 
     print gene.upper() 
     start = loc +len(gene)+ 3 

dna3 = "CATGTAATAGATGAATGACTGATAGATATGCTTGTATGCTATGAAAATGTGAAATGACCC" 
printAll(dna3.lower()) 
0

Я думаю, вы не хотите, чтобы результаты, которые приводят к печати строки до конца, поэтому вы должны управлять этими случаями. И лучше использовать для цикла для всех окончаний:

def findStopIndex(dna, index): 
    stops = [] 
    for tag in ["TGA", "TAA", "TAG"]: 
     stop = dna.find(tag, index) 
     if stop >= 0 and (stop - index) % 3 == 0: 
      stops.append(stop) 
    return min(stops) 

def printAll(dna): 
    dna = dna.upper() 
    start = 0 
    while True: 
     loc = dna.find("ATG", start) 
     if loc == -1: 
      break 
     try: 
      stop = findStopIndex(dna, loc + 3) 
     except ValueError: 
      # no ending found 
      pass 
     else: 
      print(dna[loc:stop+3]) 
     start = loc + 3 

printAll(dna3) 

Но я думаю, что вы действительно хотите, чтобы найти один из TGA, ТАА и TAG, даже если между ТГА происходит на месте, то есть не делится на 3.Это может быть сделано с помощью регулярных выражений:

import re 

def printAll(dna): 
    dna = dna.upper() 
    start = 0 
    while True: 
     mtch = re.search("ATG(...)*?(TGA|TAA|TAG)", dna[start:]) 
     if not mtch: 
      break 
     print(mtch.group()) 
     start += mtch.start() + 3 

printAll(dna3) 

и результаты еще в двух появлений:

ATGTAA 
ATGAATGACTGA 
ATGACTGATAGATATGCTTGTATGCTATGA 
ATGCTTGTATGCTATGAAAATGTGAAATGA 
ATGCTATGA 
ATGAAAATGTGA 
ATGTGA 
Смежные вопросы