吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2744|回复: 21
收起左侧

[Python 原创] (高中生物/分子生物学/生物信息学)将mRNA编码为氨基酸序列的算法实现及思路分析

  [复制链接]
mtDNA 发表于 2022-11-6 23:16
关于mRNA的翻译过程,其实不算难,也已经有很多生物信息网站的在线工具可以实现,这里简单介绍一下我自己的思路和实现。
(默认碱基任意排列,且不考虑实际情况下各种可能导致翻译无法正常进行的情况,如mRNA局部碱基配对过多导致空间结构异常等。)


#密码子表
codes={'UUU': ('Phe', 'F'), 'UUC': ('Phe', 'F'), 'UUA': ('Leu', 'L'), 'UUG': ('Leu', 'L'), \
       'UCU': ('Ser', 'S'), 'UCC': ('Ser', 'S'), 'UCA': ('Ser', 'S'), 'UCG': ('Ser', 'S'), \
       'UAU': ('Tyr', 'Y'), 'UAC': ('Tyr', 'Y'), 'UAA': ('', ''), 'UAG': ('', ''), \
       'UGU': ('Cys', 'C'), 'UGC': ('Cys', 'C'), 'UGA': ('', ''), 'UGG': ('Trp', 'W'), \
       'CUU': ('Leu', 'L'), 'CUC': ('Leu', 'L'), 'CUA': ('Leu', 'L'), 'CUG': ('Leu', 'L'), \
       'CCU': ('Pro', 'P'), 'CCC': ('Pro', 'P'), 'CCA': ('Pro', 'P'), 'CCG': ('Pro', 'P'), \
       'CAU': ('His', 'H'), 'CAC': ('His', 'H'), 'CAA': ('Gln', 'Q'), 'CAG': ('Gln', 'Q'), \
       'CGU': ('Arg', 'R'), 'CGC': ('Arg', 'R'), 'CGA': ('Arg', 'R'), 'CGG': ('Arg', 'R'), \
       'AUU': ('Ile', 'I'), 'AUC': ('Ile', 'I'), 'AUA': ('Ile', 'I'), 'AUG': ('Met', 'M'), \
       'ACU': ('Thr', 'T'), 'ACC': ('Thr', 'T'), 'ACA': ('Thr', 'T'), 'ACG': ('Thr', 'T'), \
       'AAU': ('Asn', 'N'), 'AAC': ('Asn', 'N'), 'AAA': ('Lys', 'K'), 'AAG': ('Lys', 'K'), \
       'AGU': ('Ser', 'S'), 'AGC': ('Ser', 'S'), 'AGA': ('Arg', 'R'), 'AGG': ('Arg', 'R'), \
       'GUU': ('Val', 'V'), 'GUC': ('Val', 'V'), 'GUA': ('Val', 'V'), 'GUG': ('Val', 'V'), \
       'GCU': ('Ala', 'A'), 'GCC': ('Ala', 'A'), 'GCA': ('Ala', 'A'), 'GCG': ('Ala', 'A'), \
       'GAU': ('Asp', 'D'), 'GAC': ('Asp', 'D'), 'GAA': ('Glu', 'E'), 'GAG': ('Glu', 'E'), \
       'GGU': ('Gly', 'G'), 'GGC': ('Gly', 'G'), 'GGA': ('Gly', 'G'), 'GGG': ('Gly', 'G')}

def Get_mRNA():     #获取mRNA
    mRNA=input("待分析mRNA序列(从5′到3′): ")
    print("单字母缩写\t[S]")
    print("三字母缩写\t[T]")
    while True:
        choice=input("选择缩写形式: ")
        if choice in ["S", "s", "T", "t"]:
            break

    print("\n")
    return mRNA, choice

def Get_sequences(mRNA):                   #确定三种读码方式,将mRNA分割为密码子列表
    S=list(mRNA)
    nt=len(mRNA)                           #nt表示mRNA序列长度
    S1, S2, S3=S.copy(), S.copy(), S.copy()

    if nt%3==1:                            #根据mRNA序列长度确定三种读码方式
        del S1[-1], S2[0], S3[:2], S3[-2:]
    elif nt%3==2:
        del S1[-2:], S2[0], S2[-1], S3[:2]
    else:
        del S1[0], S1[-2:], S2[:2], S2[-1]

    sequences=[S1, S2, S3]

    for i in range(len(sequences)):        #把分割结果分别写入三种读码方式的列表S1, S2, S3
        S=sequences[i]
        S_info=[]
        for n in range(len(S)-2):
            if n%3==0:
                codon=S[n]+S[n+1]+S[n+2]   #每三个碱基作为一个密码子
                S_info.append(codon)
        sequences[i]=S_info

    return sequences

def Translate(sequences, choice):
    start_codon="AUG"                       #起始密码子
    stop_codons=["UAA", "UAG", "UGA"]       #终止密码子
    peptides_set=set()                      #合成的肽链可能有重复,以集合形式去重

    for S in sequences:
        start_indexs=[]                     #保存每个读码方式的所有初始密码子位置
        stop_indexs=[]                      #保存每个读码方式的所有终止密码子位置
        ORF_ranges=[]                       #记录每个读码方式的可读范围

        for i in range(len(S)):             #记录所有初始、终止密码子位置
            if S[i]==start_codon:
                start_indexs.append(i)
            elif S[i] in stop_codons:
                stop_indexs.append(i)

        if start_indexs==[]:                #如果没有初始密码子,直接看下一种读码方式
            continue
        elif stop_indexs==[]:               #如果有初始密码子,没有终止密码子,能读到末尾
            for start in start_indexs:
                ORF_ranges.append((start, len(S)))
        else:
            for start in start_indexs:
                if start<min(stop_indexs):        #初始密码子在最左侧终止密码子的左侧
                    ORF_ranges.append((start, min(stop_indexs)))
                elif start>max(stop_indexs):      #初始密码子在最右侧终止密码子的右侧
                    ORF_ranges.append((start, len(S)))
                else:                             #初始密码子在两个终止密码子之间
                    for n in range(len(stop_indexs)-1):
                        stop1=stop_indexs[n]
                        stop2=stop_indexs[n+1]
                        if stop1<start<stop2:     #确定初始密码子位置
                            ORF_ranges.append((start, stop2))

        for r in ORF_ranges:                                           #翻译为肽链
            ORF=S[r[0] : r[1]]                                         #获取可读框
            if choice=="T" or choice=="t":                             #根据缩写形式确定肽链
                peptide=list(map(lambda codon: codes[codon][0], ORF))  #做从密码子到氨基酸的映射
                peptides_set.add("-".join(peptide))                    #peptide为列表结构,不能直接存入集合,需要转换为字符串
            elif choice=="S" or choice=="s":
                peptide=list(map(lambda codon: codes[codon][1], ORF))
                peptides_set.add("".join(peptide))   

    peptides=sorted(list(peptides_set), key=lambda p: len(p))          #按肽链从短到长排序
    return peptides

def Show_peptide(peptides, choice):
    if peptides==[]:        #没有得到肽链
        print("无初始密码子!\n")
    else:
        print("氨基酸序列: ")
        for p in peptides:
            print(p)
        print("\n")

def main():
    while True:     #无限循环方便多次输入
        mRNA, choice=Get_mRNA()
        sequences=Get_sequences(mRNA)
        peptides=Translate(sequences, choice)
        Show_peptide(peptides, choice)

if __name__=="__main__":
    main()




调试:输入后回车输入下一个
_Python 3.7.4 Shell_ 2022-11-06 22-44-13.mp4.gif



思路分析:
1.PNG

点评

希望能有个系列。:)  发表于 2023-5-4 20:48

免费评分

参与人数 7吾爱币 +11 热心值 +6 收起 理由
Rosalute + 1 我很赞同!
笙若 + 1 + 1 谢谢@Thanks!
thunor + 1 + 1 我很赞同!
wushaominkk + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
 + 1 + 1 用心讨论,共获提升!
lingweiqiu + 1 我很赞同!
田田爱崽崽 + 1 虽然属于造轮子的操作,但是有利于对翻译过程的理解,感谢

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

ciker_li 发表于 2022-11-7 08:28
现在高中生物这么难了?
头像被屏蔽
KMT-jiang 发表于 2022-11-7 08:16
Kyrie4399 发表于 2022-11-7 08:50
厉害啊,想想那时也叫编码,到现在也没想到编程解决
lingweiqiu 发表于 2022-11-7 09:17
厉害,感谢楼主分享
zys724 发表于 2022-11-7 09:27
真的厉害啊
52new 发表于 2022-11-7 09:44
这个厉害了
SVIP008 发表于 2022-11-7 09:58
这就很厉害了,支持一下
hahhahah 发表于 2022-11-7 09:59
厉害,正好对生信感兴趣,有时间可以研究下
hjxhjxjx 发表于 2022-11-7 12:41
啊?高几的生物啊?弄得我都不敢选了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 23:26

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表