【ROSALIND】【練Python,學(xué)生信】22 核酸序列剪接

如果第一次閱讀本系列文檔請先移步閱讀【ROSALIND】【練Python,學(xué)生信】00 寫在前面 ?謝謝配合~

題目:
序列剪接(RNA Splicing)
Given: A DNA string s (of length at most 1 kbp) and a collection of substrings of s acting as introns. All strings are given in FASTA format.
所給:一條長度不超過1kb的DNA序列s,以及代表內(nèi)含子的一些s子序列。
Return: A protein string resulting from transcribing and translating the exons of s. (Note: Only one solution will exist for the dataset provided.)
需得:由s序列外顯子翻譯得到的一條多肽序列。
?
測試數(shù)據(jù)
>Rosalind_10
ATGGTCTACATAGCTGACAAACAGCACGTAGCAATCGGTCGAATCTCGAGAGGCATATGGTCACATGATCGGTCGAGCGTGTTTCAAAGTTTGCGCCTAG
>Rosalind_12
ATCGGTCGAA
>Rosalind_15
ATCGGTCGAGCGTGT
測試輸出
MVYIADKQHVASREAYGHMFKVCA
?
背景
真核生物的基因是不連續(xù)的,由外顯子和內(nèi)含子組成。DNA上的內(nèi)含子會被轉(zhuǎn)錄到前體RNA中,但成熟mRNA上內(nèi)含子被剪切掉,外顯子連接在一起,在細(xì)胞中有剪接體催化這個過程的發(fā)生。
?
思路
本題的關(guān)鍵點是刪去一個序列中的一段子序列,再把剩下的序列按原來的順序連接在一起。我的思路是在原序列中查找一個內(nèi)含子序列,把除這個序列以外的其他(兩段)序列按順序存儲為一個新字符串,用新串內(nèi)容代替老串,再查找第二個內(nèi)含子序列,以此類推即可。
將該題拆為幾個小問題:
其一,讀取fasta文件并分別存儲各字符串;
其二,按上面提到的思路,在原序列中查找內(nèi)含子序列,剪接出去內(nèi)含子的成熟序列;
其三,將DNA序列轉(zhuǎn)錄為RNA序列(以‘U’替換‘T’即可);
其四,將RNA序列翻譯為蛋白質(zhì)。
可以看到,除問題二外,其余皆為之前解決過的問題。
?
代碼
codon_table = {
??? 'GCU':'A', 'GCC':'A', 'GCA':'A', 'GCG':'A', 'CGU':'R', 'CGC':'R',
??? 'CGA':'R', 'CGG':'R', 'AGA':'R', 'AGG':'R', 'UCU':'S', 'UCC':'S',
??? 'UCA':'S', 'UCG':'S', 'AGU':'S', 'AGC':'S', 'AUU':'I', 'AUC':'I',
??? 'AUA':'I', 'UUA':'L', 'UUG':'L', 'CUU':'L', 'CUC':'L', 'CUA':'L',
??? 'CUG':'L', 'GGU':'G', 'GGC':'G', 'GGA':'G', 'GGG':'G', 'GUU':'V',
??? 'GUC':'V', 'GUA':'V', 'GUG':'V', 'ACU':'T', 'ACC':'T', 'ACA':'T',
??? 'ACG':'T', 'CCU':'P', 'CCC':'P', 'CCA':'P', 'CCG':'P', 'AAU':'N',
??? 'AAC':'N', 'GAU':'D', 'GAC':'D', 'UGU':'C', 'UGC':'C', 'CAA':'Q',
??? 'CAG':'Q', 'GAA':'E', 'GAG':'E', 'CAU':'H', 'CAC':'H', 'AAA':'K',
??? 'AAG':'K', 'UUU':'F', 'UUC':'F', 'UAU':'Y', 'UAC':'Y', 'AUG':'M',
??? 'UGG':'W',
??? 'UAG':'Stop', 'UGA':'Stop', 'UAA':'Stop'
??? }
?
?
def readfasta(lines):
??? seq = []
??? index = []
??? seqplast = ""
??? numlines = 0
??? for i in lines:
??????? if '>' in i:
??????????? index.append(i.replace("\n", "").replace(">", ""))
??????????? seq.append(seqplast.replace("\n", ""))
??????????? seqplast = ""
??????????? numlines += 1
??????? else:
??????????? seqplast = seqplast + i.replace("\n", "")
??????????? numlines += 1
??????? if numlines == len(lines):
??????????? seq.append(seqplast.replace("\n", ""))
??? seq = seq[1:]
??? return index, seq
?
?
def translation(seq):
'''負(fù)責(zé)翻譯RNA為蛋白質(zhì)的函數(shù)'''
??? i = 0
??? p = ""
??? while i < len(seq)/3 - 1:
??????? n = seq[3 * i] +seq[3*i+1] + seq[3*i+2]
??????? r = codon_table[n]
??????? i += 1
??????? p = p + r
??? return p
?
?
f = open('rosalind_splc.txt', 'r')
lines = f.readlines()
f.close()
?
(index, seq) = readfasta(lines)
totlaseq = seq[0]
introns = seq[1:]? # 將讀取到的原序列和內(nèi)含子序列分別存儲
for line in introns:
??? n = len(line)? # 得到內(nèi)含子的長度
??? i = 0
??? while i < len(totlaseq) - n + 1:
??????? subseq = totlaseq[i:i + n]? # 逐個掃描長度與內(nèi)含子相同的序列
??????? if subseq == line:? # 若找到內(nèi)含子
??????????? newseq = totlaseq[:i] + totlaseq[i + n:]? # 用新字符串存儲去掉內(nèi)含子的部分
??????????? totlaseq = newseq? # 用新串取代老串
??????? i += 1
?
rnaseq = totlaseq.replace('T', 'U')
protein = translation(rnaseq)
print(protein)
?
f = open('output.txt', 'w')
f.write(protein)
f.close()