寻找DNA序列的互补序列

时间:2012-01-08 10:54:54

标签: python python-3.x translation bioinformatics dna-sequence

我必须将DNA序列的互补序列翻译成氨基酸

TTTCAATACTAGCATGACCAAAGTGGGAACCCCCTTACGTAGCATGACCCATATATATATATATA
TATATATATATATATGGGTCATGCTACGTAAGGGGGTTCCCACTTTGGTCATGCTAGTATTGAAA
+1 TyrIleTyrIleTyrGlySerCysTyrValArgGlyPheProLeuTrpSerCysStpTyrStp
+2 IleTyrIleTyrMetGlyHisAlaThrOc*GlyGlySerHisPheGlyHisAlaSerIleglu
+3 TyrIleTyrIleTrpValMetLeuArgLysGlyValProThrLeuValMetLeuValLeuLys
  • 第一个序列是正常序列,
  • 第二个是互补序列,
  • 具有+1的那个是对应于我的互补序列的氨基酸序列
  • 具有+2的那个是对应于从第二碱基开始的互补序列的氨基酸序列
  • 具有+3的那个是对应于以第三碱基开始的互补序列的氨基酸序列

我已经尝试了下一个代码来获得我的结果,但所以我得到了一个补充的seq。没有分裂。

seq = "CCGGAAGAGCTTACTTAG"
basecomplement = {'A': 'T', 'C': 'G', 'G': 'C', 'T': 'A'}

def translate(seq):

    x = 0
    aaseq = []
    while True:
        try:
            aaseq.append(basecomplement[seq[x:x+1]])
            x += 1

        except (IndexError, KeyError):
            break
    return aaseq

for frame in range(1):
    #print(translate(seq[frame:]))

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

    rseqn = list(rseqn)
    rseqn.reverse()

    print( rseqn)

有人可以帮助我获得我的结果吗?

3 个答案:

答案 0 :(得分:9)

好像你已经采用了一些代码并尝试使用它而根本不了解它的作用。如果您阅读linked question,您会注意到该问题中的海报上有一个由|分隔的氨基酸代码字典字典。对split的调用是提取每个代码字符串的第二部分,例如来自"F|Phe"您希望得到"Phe",这就是为什么海报需要split。你没有那些类型的字符串,所以你不应该使用那部分代码。

我将推荐使用BioPython的joaquin建议,因为它显然是适合这项工作的工具,但出于学习目的:您需要知道的第一件事是您要完成四项任务:

  1. 计算DNA碱基序列的反向互补序列
  2. 将反向互补序列分成3个碱基的组
  3. 将每个组转换为氨基酸代码
  4. 将氨基酸代码组合成一个字符串
  5. 链接答案中的代码不处理第一步。为此,您可以使用Python字符串对象的translate方法。首先,您使用maketrans生成将映射key =>的翻译词典。值,

    basecomplement = str.maketrans({'A': 'T', 'C': 'G', 'G': 'C', 'T': 'A'})
    

    然后你可以写一个方法来产生反向补码,

    def reverse_complement(seq):
        return seq.translate(basecomplement)[::-1]
    

    joaquin关于另一个问题的答案的translate方法实现了步骤2和3.使用itertools中的grouper配方实际上可以更有效地完成。首先,你需要一个字典映射基础三联体到氨基酸,

    amino_acids = {'TAT': 'Tyr', ...}
    

    然后你可以用它来转换任何碱基序列,

    amino_acids[''.join(a)] for a in zip(*([iter(rseq)]*3))
    

    作为解释,zip(*([iter(rseq)]*3))一次对三个角色进行分组。但它确实是元组,而不是字符串,例如对于'TATATA',你得到('T', 'A', 'T'), ('A', 'T', 'A'),所以你需要加入每个元组来创建一个字符串。这就是''.join(a)的作用。然后在氨基酸表中查找字符串,由amino_acids[...]完成。

    最后,您需要将所有生成的氨基酸代码连接在一起,这可以通过外部''.join(...)来完成。所以你可以定义一个这样的方法:

    def to_amino_acids(seq):
        return ''.join(amino_acids[''.join(a)] for a in zip(*([iter(rseq)]*3)))
    

    请注意,除非.split('|')字典包含由amino_acids分隔的多个表示,否则您不需要|

    最后,为了将碱基转换为氨基酸的三种不同方法(即三个框架),你可以使用类似于joaquin答案中最后一个循环的东西,

    rseq = reverse_complement(seq)
    for frame in range(3):
        # print the frame number
        print('+', frame+1, end=' ')
        # translate the base sequence to amino acids and print it
        print(to_amino_acids(rseq[frame:]))
    

    请注意,此循环运行三次次,以打印三个不同的帧。如果你想让它运行一次就没有意义了。

答案 1 :(得分:6)

使用:

for frame in range(1):
    rseqn = reversed([item for item in translate(seq[frame:])])
    rseqn = ''.join(rseqn)

    print(rseqn)

这会产生正确的互补(反向)安全性:

CTAAGTAAGCTCTTCCGG

请注意,您不需要for循环(当前实际上无效)确定DNA或RNA互补序列,因为这与翻译框架无关。

尽管如此,我必须强调,如果您开始将BioPython用于Bioinformatic任务, ALL 您的代码可以简化为四行:

>>> from Bio import SeqIO
>>> from Bio.Alphabet import NucleotideAlphabet
>>> dna = SeqIO.Seq("CCGGAAGAGCTTACTTAG", NucleotideAlphabet())
>>> dna.reverse_complement()
Seq('CTAAGTAAGCTCTTCCGG', NucleotideAlphabet())
>>> 

答案 2 :(得分:0)

我已经清理了一下代码:

seq = "CCGGAAGAGCTTACTTAG"
basecomplement = {'A': 'T', 'C': 'G', 'G': 'C', 'T': 'A'}

def translate(seq):
    aaseq = []
    for character in seq:
        aaseq.append(basecomplement[character])
    return aaseq

for frame in range(1):
    rseqn= (''.join(item.split('|')[0] for item in translate(seq[frame:])))
    rseqn = rseqn[::-1]
    print( rseqn)

看看这是否适合你。

您正在做的是将rseqn转换为列表,反转列表并打印列表。我编写的代码从未将rseqn转换为列表。 rseqn最初是一个字符串,行rseqn = rseqn[::-1]为你反转字符串。所以,最后,你打印的是一个字符串,而不是一个列表,因此,没有分裂。