Найти самую длинную палиндромную подстроку фрагмента ДНК - PullRequest
2 голосов
/ 25 апреля 2020

Я должен сделать функцию, которая печатает самую длинную палиндромную подстроку фрагмента ДНК. Я уже написал функцию, которая проверяет, является ли кусок ДНК самим палиндромом. См. Функцию ниже.

def make_complement_strand(DNA):
    complement=[]
    rules_for_complement={"A":"T","T":"A","C":"G","G":"C"}
    for letter in DNA:
        complement.append(rules_for_complement[letter])
    return(complement)

def is_this_a_palindrome(DNA): 
        DNA=list(DNA)
        if DNA!=(make_complement_strand(DNA)[::-1]):     
            print("false")                  
            return False
        else:                             
            print("true")
            return True

is_this_a_palindrome("GGGCCC") 

Но теперь: как сделать функцию, печатающую самую длинную палиндромную подстроку строки ДНК?

Значение палиндрома в контексте генетики немного отличается из определения, используемого для слов и предложений. Поскольку двойная спираль образована двумя спаренными нитями нуклеотидов, которые проходят в противоположных направлениях в смысле 5'-3 ', а нуклеотиды всегда спариваются одинаково (аденин (A) с тимином (T) для ДНК, с урацилом (U) для РНК; цитозин (C) с гуанином (G)) (одноцепочечная) нуклеотидная последовательность называется палиндромом, если она равна его обратному комплементу. Например, последовательность ДНК ACCTAGGT представляет собой палиндром c, поскольку ее нуклеотидный нуклеотидный комплемент представляет собой TGGATCCA, и обратный порядок нуклеотидов в комплементе дает исходную последовательность.

1 Ответ

1 голос
/ 25 апреля 2020

Здесь это должно быть хорошей отправной точкой для получения самой длинной подстроки палиндрома.

def make_complement_strand(DNA):
    complement=[]
    rules_for_complement={"A":"T","T":"A","C":"G","G":"C"}
    for letter in DNA:
        complement.append(rules_for_complement[letter])
    return(complement)

def is_this_a_palindrome(DNA): 
        DNA=list(DNA)
        if DNA!=(make_complement_strand(DNA)[::-1]):     
            #print("false")                  
            return False
        else:                             
            #print("true")
            return True


def longest_palindrome_ss(org_dna, palindrone_func):
    '''
    Naive implementation-

    We start with 2 pointers.
    i starts at start of current subsqeunce and j starts from i+1 to end
    increment i with every loop

    Uses palindrome function provided by user

    Further improvements- 
    1. Start with longest sequence instead of starting with smallest. i.e. start with i=0 and j=final_i and decrement.
    '''
    longest_palin=""
    i=j=0
    last_i=len(org_dna)
    while i < last_i:
        j=i+1
        while j < last_i:
            current_subsequence = org_dna[i:j+1]
            if palindrone_func(current_subsequence):
                if len(current_subsequence)>len(longest_palin):
                    longest_palin=current_subsequence
            j+=1
        i+=1
    print(org_dna, longest_palin)
    return longest_palin


longest_palindrome_ss("GGGCCC", is_this_a_palindrome)
longest_palindrome_ss("GAGCTT", is_this_a_palindrome)
longest_palindrome_ss("GGAATTCGA", is_this_a_palindrome)

Вот несколько казней -

mahorir@mahorir-Vostro-3446:~/Desktop$ python3 dna_paln.py 
GGGCCC GGGCCC
GAGCTT AGCT
GGAATTCGA GAATTC
...