欢迎光临散文网 会员登陆 & 注册

【ROSALIND】【练Python,学生信】22 核酸序列剪接

2019-02-18 16:50 作者:未琢  | 我要投稿

如果第一次阅读本系列文档请先移步阅读【ROSALIND】【练Python,学生信】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,以及代表内含子的一些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序列外显子翻译得到的一条多肽序列。

 

测试数据

>Rosalind_10

ATGGTCTACATAGCTGACAAACAGCACGTAGCAATCGGTCGAATCTCGAGAGGCATATGGTCACATGATCGGTCGAGCGTGTTTCAAAGTTTGCGCCTAG

>Rosalind_12

ATCGGTCGAA

>Rosalind_15

ATCGGTCGAGCGTGT

测试输出

MVYIADKQHVASREAYGHMFKVCA

 

背景

真核生物的基因是不连续的,由外显子和内含子组成。DNA上的内含子会被转录到前体RNA中,但成熟mRNA上内含子被剪切掉,外显子连接在一起,在细胞中有剪接体催化这个过程的发生。

 

思路

本题的关键点是删去一个序列中的一段子序列,再把剩下的序列按原来的顺序连接在一起。我的思路是在原序列中查找一个内含子序列,把除这个序列以外的其他(两段)序列按顺序存储为一个新字符串,用新串内容代替老串,再查找第二个内含子序列,以此类推即可。

将该题拆为几个小问题:

其一,读取fasta文件并分别存储各字符串;

其二,按上面提到的思路,在原序列中查找内含子序列,剪接出去内含子的成熟序列;

其三,将DNA序列转录为RNA序列(以‘U’替换‘T’即可);

其四,将RNA序列翻译为蛋白质。

可以看到,除问题二外,其余皆为之前解决过的问题。

 

代码

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):

'''负责翻译RNA为蛋白质的函数'''

    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:]  # 将读取到的原序列和内含子序列分别存储

for line in introns:

    n = len(line)  # 得到内含子的长度

    i = 0

    while i < len(totlaseq) - n + 1:

        subseq = totlaseq[i:i + n]  # 逐个扫描长度与内含子相同的序列

        if subseq == line:  # 若找到内含子

            newseq = totlaseq[:i] + totlaseq[i + n:]  # 用新字符串存储去掉内含子的部分

            totlaseq = newseq  # 用新串取代老串

        i += 1

 

rnaseq = totlaseq.replace('T', 'U')

protein = translation(rnaseq)

print(protein)

 

f = open('output.txt', 'w')

f.write(protein)

f.close()


【ROSALIND】【练Python,学生信】22 核酸序列剪接的评论 (共 条)

分享到微博请遵守国家法律