寻找DNA序列的补体

2024-04-27 05:54:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我得把DNA序列的补体转换成氨基酸

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

我已经尝试了下一个代码来获得我的结果,但是我得到的只是一个补码air 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)

有人能帮我弄到结果吗??


Tags: infor序列itemframeseqtranslatedna
3条回答

似乎你已经采取了一些代码,并试图使用它,根本不知道它做什么。如果你读了linked question,你会注意到这个问题的海报上有一个氨基酸代码串字典,用|分隔。对split的调用是提取每个代码字符串的第二部分,例如,从要获取"F|Phe""Phe"中提取,这就是海报需要split的原因。你没有这样的字符串,所以你不应该使用那部分代码。

我将支持joaquin关于使用BioPython的建议,因为它显然是工作的正确工具,但出于学习目的:首先你需要知道的是你有四项任务要完成:

  1. 计算DNA碱基序列的反补体
  2. 将反向互补序列分成3个碱基组
  3. 把每一个基团转换成一个氨基酸代码
  4. 把氨基酸编码串起来

链接答案中的代码无法处理第一步。为此,可以使用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。实际上,使用^{}中的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:]))

注意,这个循环运行三次以打印三个不同的帧。如果你只想让它运行一次,那么循环是没有意义的。

我把代码整理了一下:

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]为您反转该字符串。所以,最后,你要打印的是一个字符串而不是一个列表,因此,没有拆分。

使用:

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

    print(rseqn)

这会产生正确的互补(反向)合流:

CTAAGTAAGCTCTTCCGG

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

尽管如此,我必须强调,如果您开始使用BioPython执行生物信息任务,那么您的代码可以简化为四行:

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

相关问题 更多 >