翻译我的序列?

1 投票
3 回答
2390 浏览
提问于 2025-04-17 09:23

我需要写一个脚本来翻译这个序列:

dict = {"TTT":"F|Phe","TTC":"F|Phe","TTA":"L|Leu","TTG":"L|Leu","TCT":"S|Ser","TCC":"S|Ser",
              "TCA":"S|Ser","TCG":"S|Ser", "TAT":"Y|Tyr","TAC":"Y|Tyr","TAA":"*|Stp","TAG":"*|Stp",
              "TGT":"C|Cys","TGC":"C|Cys","TGA":"*|Stp","TGG":"W|Trp", "CTT":"L|Leu","CTC":"L|Leu",
              "CTA":"L|Leu","CTG":"L|Leu","CCT":"P|Pro","CCC":"P|Pro","CCA":"P|Pro","CCG":"P|Pro",
              "CAT":"H|His","CAC":"H|His","CAA":"Q|Gln","CAG":"Q|Gln","CGT":"R|Arg","CGC":"R|Arg",
              "CGA":"R|Arg","CGG":"R|Arg", "ATT":"I|Ile","ATC":"I|Ile","ATA":"I|Ile","ATG":"M|Met",
              "ACT":"T|Thr","ACC":"T|Thr","ACA":"T|Thr","ACG":"T|Thr", "AAT":"N|Asn","AAC":"N|Asn",
              "AAA":"K|Lys","AAG":"K|Lys","AGT":"S|Ser","AGC":"S|Ser","AGA":"R|Arg","AGG":"R|Arg",
              "GTT":"V|Val","GTC":"V|Val","GTA":"V|Val","GTG":"V|Val","GCT":"A|Ala","GCC":"A|Ala",
              "GCA":"A|Ala","GCG":"A|Ala", "GAT":"D|Asp","GAC":"D|Asp","GAA":"E|Glu",
              "GAG":"E|Glu","GGT":"G|Gly","GGC":"G|Gly","GGA":"G|Gly","GGG":"G|Gly"}

seq = "TTTCAATACTAGCATGACCAAAGTGGGAACCCCCTTACGTAGCATGACCCATATATATATATATA"
a=""

for y in range( 0, len ( seq)):
    c=(seq[y:y+3])
    #print(c)
    for  k, v in dict.items():
        if seq[y:y+3] == k:
            alle_amino = v[::3] #alle aminozuren op rijtje, a1.1 -a2.1- a.3.1-a1.2 enzo
            print (v)

通过这个脚本,我可以从三个框架中获取氨基酸,并且它们是上下排列的。但是我该如何整理这些氨基酸,让框架1的氨基酸排在一起,框架2的氨基酸排在一起,框架3的氨基酸也排在一起呢?

比如说,我的结果应该是:

+3 SerIleLeuAlaStpProLysTrpGluProProTyrValAlaStpProIleTyrIleTyrTle

+2 PheAsnThrSerMetThrLysValGlyThrProLeuArgSerMetThrHisIleTyrIleTyr

+1 PheGlnTyrStpHisAspGlnSerGlyAsnProLeuThrStpHisAspProTyrIleTyrIle

TTTCAATACTAGCATGACCAAAGTGGGAACCCCCTTACGTAGCATGACCCATATATATATATATA

我使用的是Python 3。

我还有一个问题:我可以通过对我自己的脚本做一些修改来得到这些结果吗?

3 个回答

1

这是我的解决方案。我把你提到的“dict”变量叫做“aminos”。这个函数 method3 会返回“|”右边的所有值,想要把它们合并成一个字符串,只需要用“”把它们连接起来就可以了。

根据我对你代码的观察,我认为你的 aminos 字典里包含了所有可能的三字母组合。因此,我去掉了那些用来验证的检查,这样程序运行起来应该会快很多。

def overlapping_groups(seq, group_len=3):
    """Returns `N` adjacent items from an iterable in a sliding window style
    """
    for i in range(len(seq)-group_len):
        yield seq[i:i+group_len]

def method3(seq, aminos):
    return [aminos[k][2:] for k in overlapping_groups(seq, 3)]

for i in range(3):
    print("%d: %s" % (i, "".join(method3(seq[i:], aminos))))
1

虽然看起来不太好,但能满足你的需求。

dct = {"TTT":"F|Phe","TTC":"F|Phe","TTA":"L|Leu","TTG":"L|Leu","TCT":"S|Ser","TCC":"S|Ser", 
"TCA":"S|Ser","TCG":"S|Ser", "TAT":"Y|Tyr","TAC":"Y|Tyr","TAA":"*|Stp","TAG":"*|Stp", 
"TGT":"C|Cys","TGC":"C|Cys","TGA":"*|Stp","TGG":"W|Trp", "CTT":"L|Leu","CTC":"L|Leu", 
"CTA":"L|Leu","CTG":"L|Leu","CCT":"P|Pro","CCC":"P|Pro","CCA":"P|Pro","CCG":"P|Pro", 
"CAT":"H|His","CAC":"H|His","CAA":"Q|Gln","CAG":"Q|Gln","CGT":"R|Arg","CGC":"R|Arg", 
"CGA":"R|Arg","CGG":"R|Arg", "ATT":"I|Ile","ATC":"I|Ile","ATA":"I|Ile","ATG":"M|Met", 
"ACT":"T|Thr","ACC":"T|Thr","ACA":"T|Thr","ACG":"T|Thr", "AAT":"N|Asn","AAC":"N|Asn", 
"AAA":"K|Lys","AAG":"K|Lys","AGT":"S|Ser","AGC":"S|Ser","AGA":"R|Arg","AGG":"R|Arg", 
"GTT":"V|Val","GTC":"V|Val","GTA":"V|Val","GTG":"V|Val","GCT":"A|Ala","GCC":"A|Ala", 
"GCA":"A|Ala","GCG":"A|Ala", "GAT":"D|Asp","GAC":"D|Asp","GAA":"E|Glu", 
"GAG":"E|Glu","GGT":"G|Gly","GGC":"G|Gly","GGA":"G|Gly","GGG":"G|Gly"}


seq = "TTTCAATACTAGCATGACCAAAGTGGGAACCCCCTTACGTAGCATGACCCATATATATATATATA"

def get_amino_list(s):
    for y in range(3):
        yield [s[x:x+3] for x in range(y, len(s) - 2, 3)]

for n, amn in enumerate(get_amino_list(seq), 1):
    print ("+%d " % n + "".join(dct[x][2:] for x in amn))

print(seq)
5

你可以使用(注意,使用biopython的translate方法会简单得多):

dictio = {your dictionary here}

def translate(seq):
    x = 0
    aaseq = []
    while True:
        try:
            aaseq.append(dicti[seq[x:x+3]])
            x += 3
        except (IndexError, KeyError):
            break
    return aaseq

seq = "TTTCAATACTAGCATGACCAAAGTGGGAACCCCCTTACGTAGCATGACCCATATATATATATATA"

for frame in range(3):
    print('+%i' %(frame+1), ''.join(item.split('|')[1] for item in translate(seq[frame:])))

我把你的字典名字改成了dicti(这样就不会覆盖掉dict这个名字)。


这里有一些注释,帮助你理解:

translate这个函数会接收你的序列,并把它转换成一个列表,每个列表项对应于那个位置的三联体编码所翻译出的氨基酸。比如:

aaseq = ["L|Leu","L|Leu","P|Pro", ....]

你可以在translate里面进一步处理这些数据(只获取一个字母或三个字母的代码),或者像我这样直接返回原始数据,之后再处理。

translate是在

''.join(item.split('|')[1] for item in translate(seq[frame:]))

每个框架中调用的。对于框架值为0、1或2时,它会把seq[frame:]作为参数传给translate。也就是说,你在依次处理对应于三种不同阅读框的序列。然后,在

   ''.join(item.split('|')[1]

我把每个氨基酸的一字母和三字母代码分开,并取出索引为1的那个(第二个)。然后把它们合并成一个字符串。

撰写回答