寻找DNA序列的互补序列

Emi*_*raz -1 python translation bioinformatics dna-sequence python-3.x

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

TTTCAATACTAGCATGACCAAAGTGGGAACCCCCTTACGTAGCATGACCCATATATATATATATA
TATATATATATATATGGGTCATGCTACGTAAGGGGGTTCCCACTTTGGTCATGCTAGTATTGAAA
+1 TyrIleTyrIleTyrGlySerCysTyrValArgGlyPheProLeuTrpSerCysStpTyrStp
+2 IleTyrIleTyrMetGlyHisAlaThrOc*GlyGlySerHisPheGlyHisAlaSerIleglu
+3 TyrIleTyrIleTrpValMetLeuArgLysGlyValProThrLeuValMetLeuValLeuLys
Run Code Online (Sandbox Code Playgroud)
  • 第一个序列是正常序列,
  • 第二个是互补序列,
  • 具有+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)
Run Code Online (Sandbox Code Playgroud)

谁能帮助我得到我的结果?

Dav*_*d Z 9

看起来你已经采用了一些代码并尝试使用它而完全不了解它的作用.如果您阅读链接的问题,您会注意到该问题中的海报上有一个由...分隔的氨基酸代码字典|.调用split是提取每个代码字符串的第二部分,例如从"F|Phe"你想要获取"Phe",这就是海报需要的原因split.您没有这些类型的字符串,因此您不应该使用该部分代码.

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

  1. 计算DNA碱基序列的反向互补序列
  2. 将反向互补序列分成3个碱基的组
  3. 将每个组转换为氨基酸代码
  4. 将氨基酸代码放在一起

链接答案中的代码不处理第一步.为此,您可以使用translatePython字符串对象的方法.首先,您使用maketrans生成将映射key => value的翻译字典,

basecomplement = str.maketrans({'A': 'T', 'C': 'G', 'G': 'C', 'T': 'A'})
Run Code Online (Sandbox Code Playgroud)

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

def reverse_complement(seq):
    return seq.translate(basecomplement)[::-1]
Run Code Online (Sandbox Code Playgroud)

translate华对其他问题的回答的方法实施步骤2和3更有效地使用它实际上可以做grouper的食谱itertools.首先,你需要一个字典映射基础三联体到氨基酸,

amino_acids = {'TAT': 'Tyr', ...}
Run Code Online (Sandbox Code Playgroud)

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

amino_acids[''.join(a)] for a in zip(*([iter(rseq)]*3))
Run Code Online (Sandbox Code Playgroud)

作为解释,一次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)))
Run Code Online (Sandbox Code Playgroud)

请注意,.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:]))
Run Code Online (Sandbox Code Playgroud)

请注意,这个循环运行3次,打印三种不同的帧.如果你想让它运行一次就没有任何意义.


joa*_*uin 6

使用:

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

    print(rseqn)
Run Code Online (Sandbox Code Playgroud)

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

CTAAGTAAGCTCTTCCGG
Run Code Online (Sandbox Code Playgroud)

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

然而,话虽如此,我必须强调,如果您开始将BioPython用于Bioinformatic任务,那么所有代码都可以简化为四行:

>>> from Bio import SeqIO
>>> from Bio.Alphabet import NucleotideAlphabet
>>> dna = SeqIO.Seq("CCGGAAGAGCTTACTTAG", NucleotideAlphabet())
>>> dna.reverse_complement()
Seq('CTAAGTAAGCTCTTCCGG', NucleotideAlphabet())
>>> 
Run Code Online (Sandbox Code Playgroud)

  • @ user1136962谁不允许使用适当的库来执行给定任务?如果这是家庭作业,您必须标记您的问题.我对艾米恩说了同样的话. (4认同)