【问题标题】:Finding the complement of a DNA sequence寻找 DNA 序列的互补序列
【发布时间】:2012-01-08 10:54:54
【问题描述】:

我必须将 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)

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

【问题讨论】:

  • 我试图清理问题以明确提出的问题。
  • 我重写了我的序列以使其清晰。

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


【解决方案1】:

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

我会同意 joaquin 的建议,即使用 BioPython,因为它显然是适合这项工作的工具,但出于学习目的:首先你需要知道的是你有四个任务要完成:

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

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

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

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

【讨论】:

  • 如果您想了解拆分(以及所有内容)的来源see my answer here
  • 非常感谢,但我还有一个问题:知道我有 + 1 TAATAATAA |Stp*|Stp*|Stp + 2 AATAATAA *|Stp*|Stp*|Stp + 3 ATAATAA *|Stp*|Stp*|Stp 但我必须选择第一个符号,因此是 ()
  • 我使用了这个答案中描述的seq.translate(basecomplement)[::-1]技术,它比使用biopython(至少在python 2中)更快。
【解决方案2】:

用途:

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())
>>> 

【讨论】:

  • @user1136962 谁不允许为给定任务使用适当的库?如果这是家庭作业,您必须这样标记您的问题。我对 Emyne 也是这么说的。
【解决方案3】:

我已经清理了一些代码:

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

【讨论】:

  • 我不完全明白你所说的拆分是什么意思。这是对我能理解的内容的回应。
猜你喜欢
  • 2013-09-17
  • 2013-10-21
  • 2013-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多