5SOO_O 의 개발 공부 일지
[Python] [Rosalind] RNA Splicing 본문
dna와 인트론 역할을 하는 염기 서열이 주어진다.
dna 의 엑손을 전사하고 번역해 생성된 단백질 문자열을 구하는 문제이다.
엑손과 인트론
진핵 세포의 DNA는 원핵세포의 DNA와 달리
실제로 단백질 합성 정보를 갖는 부분과 그렇지 않은 부분이 섞여서 존재한다.
여기서 엑손은 실제로 단백질 합성 정보를 갖는 부분이고,
인트론은 단백질 합성 정보가 없는 대신, 단백질 전사를 시작하도록 유도하는 프로모터 등 전사를 돕는 정보를 가지고 있다.
단백질에 따라 전사 과정에서 의미없는 부분인 인트론을 잘라내는 과정이 일어난다.
이 과정을 마치고 합쳐진 엑손의 총 합을 엑솜이라고 한다.
문제 풀기
다운 받은 파일을 열어 보면
왕창 긴 dna 염기 서열 + 인트론 으로 이루어져 있다.

1. 파일 읽어서 딕셔너리에 담는 함수
def read_data(txt):
with open(txt, "r") as file:
dna = file.read().splitlines()
dna_talbe = dict()
label = ""
for d in dna:
if d.startswith(">"):
label = d
dna_talbe[label] = ""
continue
dna_talbe[label] += d
return dna_talbe

기다란 염기 서열과 인트론들로 나눠 담긴다.
2. { "염기서열" : "염기서열", "인트론" : [인트론1, 인트론2, 인트론3, ...] } 으로 나눠 담기
def introns(dna_table):
result = {"dna_sequence" : "", "introns" : []}
for idx, (key, value) in enumerate(dna_table.items()):
if idx == 0:
result["dna_sequence"] += value
else:
result["introns"].append(value)
return result
dna와 인트론을 나눠 담을 빈 딕셔너리를 만든다.
(key:value) 쌍과 인덱스를 뽑아,
첫 번째 key:value는 (제일 긴, 분리할 염기 서열) dna_sequence에 담고
나머지 인트론들은 key=introns 에 해당하는 value 자리의 리스트에 담아준다.
3. 엑솜을 구하는 함수
def exon(dna_and_introns):
exon_seq = dna_and_introns["dna_sequence"]
for intron in dna_and_introns["introns"]:
exon_seq = exon_seq.replace(intron, "")
return exon_seq
위에서 구한 {dna:dna, introns:[intron1, intron2...]} 딕셔너리의 dna만 가져와 검사한다.
introns 의 value 리스트에서 인트론을 하나씩 뽑아,
exon_seq에 intron이 있다면 replace()를 사용해 빼준다.
4. 위에서 구한 엑솜을 단백질로 바꿔주는 함수
start 코돈인 "ATG"를 찾아 start 변수에 담고, 빈 문자열 protein 을 선언한다.
그 다음 위에서 구한 exom에서 T를 U로 바꿔 주고( 사실 이거부터 했어야 했는데 늦게 생각나 버렸다 ㅎ)
for문을 start코돈부터 exom의 끝까지 3step씩 돌린다.
exom[i:i+3] (세 개씩 묶여 하나의 코돈을 이루므로) 을 codon 변수에 담는다.
이 때, codons 딕셔너리의 codon 키에 해당하는 값이 Stop 이면 protein을 반환한다.
계속 for문을 돌며 protein에 codons[codon]에 해당하는 단백질을 더해가고, Stop 코돈 이전 코돈까지 번역을 마친
단백질을 최종 반환한다.
def make_protein(exom):
codons = {
"UUU": "F",
"UUC": "F",
"UUA": "L",
"UUG": "L",
"UCU": "S",
"UCC": "S",
"UCA": "S",
"UCG": "S",
"UAU": "Y",
"UAC": "Y",
"UAA": "Stop",
"UAG": "Stop",
"UGA": "Stop",
"UGG": "W",
"UGU": "C",
"UGC": "C",
"CUU": "L",
"CUC": "L",
"CUA": "L",
"CUG": "L",
"CCU": "P",
"CCC": "P",
"CCA": "P",
"CCG": "P",
"CAU": "H",
"CAC": "H",
"CAA": "Q",
"CAG": "Q",
"CGU": "R",
"CGC": "R",
"CGA": "R",
"CGG": "R",
"AUU": "I",
"AUC": "I",
"AUA": "I",
"AUG": "M",
"ACU": "T",
"ACC": "T",
"ACA": "T",
"ACG": "T",
"AAU": "N",
"AAC": "N",
"AAA": "K",
"AAG": "K",
"AGU": "S",
"AGC": "S",
"AGA": "R",
"AGG": "R",
"GUU": "V",
"GUC": "V",
"GUA": "V",
"GUG": "V",
"GCU": "A",
"GCC": "A",
"GCA": "A",
"GCG": "A",
"GAU": "D",
"GAC": "D",
"GAA": "E",
"GAG": "E",
"GGU": "G",
"GGC": "G",
"GGA": "G",
"GGG": "G"
}
protein = ""
start = exom.find("ATG")
exom = exom.replace("T", "U")
for i in range(start, len(exom), 3):
codon = exom[i:i+3]
if codons[codon] == "Stop":
return protein
protein += codons[codon]
return protein

단백질이 잘 뽑혔다 !
'자료구조 및 바이오 인포매틱스' 카테고리의 다른 글
| [Python] [Rosalind] Locating Restriction Sites (0) | 2022.04.14 |
|---|---|
| [Python] [Rosalind] Calculating Protein Mass (0) | 2022.04.14 |
| [Bioinformatics] 코돈-단백질 테이블, 단백질 질량 테이블 (0) | 2022.04.14 |
| [Python] [Rosalind] Enumerating Gene Orders (0) | 2022.04.14 |
| [Python] [Rosalind] Independent Alleles (0) | 2022.04.12 |