-1

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

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

我已经尝试了下一个代码来获得我的结果,但是我只得到了一个补充序列。没有分裂。

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)

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

4

3 回答 3

9

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

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

  1. 计算 DNA 碱基序列的反向互补
  2. 将反向互补序列分成 3 个碱基组
  3. 将每一组转换成一个氨基酸代码
  4. 将氨基酸代码组合成一个字符串

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

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来自的配方更有效地完成itertools。首先,您需要一个将碱基三元组映射到氨基酸的字典,

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:]))

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

于 2012-01-08T11:22:37.293 回答
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 用于您的生物信息学任务,您的所有代码都可以简化为四行:

>>> from Bio import SeqIO
>>> from Bio.Alphabet import NucleotideAlphabet
>>> dna = SeqIO.Seq("CCGGAAGAGCTTACTTAG", NucleotideAlphabet())
>>> dna.reverse_complement()
Seq('CTAAGTAAGCTCTTCCGG', NucleotideAlphabet())
>>> 
于 2012-01-08T11:09:51.800 回答
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]会为您反转字符串。因此,最后,您要打印的是字符串而不是列表,因此没有拆分。

于 2012-01-08T11:14:34.183 回答