5SOO_O 의 개발 공부 일지

[Python] [Rosalind] Locating Restriction Sites 본문

자료구조 및 바이오 인포매틱스

[Python] [Rosalind] Locating Restriction Sites

5soo_o 2022. 4. 14. 14:58

길이가 4~12 사이인 문자열의 reverse palindrome을 구해야 한다.

 

1. 다운 받은 파일을 열어서, >Rosalind 라벨을 제외 한 염기 서열 만 담는다.

with open("rosalind_revp.txt") as file:
    read = file.read().splitlines()
    dna = ""
    for d in read:
        if d.startswith(">"):
            pass
        else:
            dna += d

 

2. 상보적인 염기 서열을 구한다.

complement = {"A":"T", "C":"G", "G":"C", "T":"A"}

dna_com=''

for d in dna:
    dna_com += complement[d]

 

 

3. dna를 검사하는데,

0번째 인덱스 문자 ~ (j=4) 4번째 인덱스 문자까지, 1번째 ~ (j=4) 4번째, 2번째 ~ (j=4) 4번째, 마지막 인덱스 ~ (j=4) 4번째 문자까지 검사 했을 때 palindrome 이면 출력하고,

1번째 인덱스 문자 ~ (j=5) 5번째 인덱스, 2번째~(j=5), 3번째~(j=5) 5 번째, .... 마지막 인덱스 문자~(j=5) 5번째 인덱스 문자까지

2번째 인덱스 ~ (j=6) 6번째, 3번째 인덱스 ~ (j=6) 6번째, 4번째 인덱스 ~ (j=6) 6번째, ...., 마지막 인덱스 ~ (j=6) 6번째 문자까지

쭉쭉쭉 j 가 12일 때 까지 검사한다.

for i in range(len(dna)-4+1):
    j = 4
    while j <= 12:
	# i~i+j번째 서열이  i~i+j 번째 dna를 뒤집은 것과 같다면
        if dna[i:i+j] == (dna_com[i:i+j])[::-1]:	
            if i + j < len(dna):
                print(i + 1, j)
            else:
                print(i + 1, len(dna) - i)
                i += 1
        j += 1

 

 

전체 코드

with open("rosalind_revp.txt") as file:
    read = file.read().splitlines()
    dna = ""
    for d in read:
        if d.startswith(">"):
            pass
        else:
            dna += d


complement = {"A":"T", "C":"G", "G":"C", "T":"A"}

dna_com=''

for d in dna:
    dna_com += complement[d]



for i in range(len(dna)-4+1):
    j = 4
    while j <= 12:

        if dna[i:i+j] == (dna_com[i:i+j])[::-1]:
            if i + j < len(dna):
                print(i + 1, j)
            else:
                print(i + 1, len(dna) - i)
                i += 1
        j += 1

 

이 때 출력되는 i 값은 palindrome이 있는 위치이며,

j 값은 palindrome이 있는기 검사하기 위해 묶은 염기 서열 길이이다.

        if dna[i:i+j] == (dna_com[i:i+j])[::-1]:
            if i + j < len(dna):
                print(i + 1, j)
            else:
                print(i + 1, len(dna) - i)
                i += 1

dna를 가른 다음 뒤집은게 dna를 가른 것과 같다면

인덱스와 dna를 가를 길이를 더한 값이 dna전체 길이보다 작은지 검사한다. ( 주어진 염기 서열을 넘지 않도록 ) 

주어진 dna 범위 내라면, 얻은 값을 그대로 출력하면 되고,

palindrome인데 주어진 범위를 벗어나면, palindrome이 시작하는 위치와 전체 길이에서 palindrome이 있는 위치를 뺀 값을 출력한다. ( palindrome이 있는 위치와 끝 인덱스에서 그 위치 까지의 길이 )

728x90