我必须将DNA序列的互补序列翻译成氨基酸
TTTCAATACTAGCATGACCAAAGTGGGAACCCCCTTACGTAGCATGACCCATATATATATATATA
TATATATATATATATGGGTCATGCTACGTAAGGGGGTTCCCACTTTGGTCATGCTAGTATTGAAA
+1 TyrIleTyrIleTyrGlySerCysTyrValArgGlyPheProLeuTrpSerCysStpTyrStp
+2 IleTyrIleTyrMetGlyHisAlaThrOc*GlyGlySerHisPheGlyHisAlaSerIleglu
+3 TyrIleTyrIleTrpValMetLeuArgLysGlyValProThrLeuValMetLeuValLeuLys
我已经尝试了下一个代码来获得我的结果,但所以我得到了一个补充的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)
有人可以帮助我获得我的结果吗?
答案 0 :(得分:9)
好像你已经采用了一些代码并尝试使用它而根本不了解它的作用。如果您阅读linked question,您会注意到该问题中的海报上有一个由|
分隔的氨基酸代码字典字典。对split
的调用是提取每个代码字符串的第二部分,例如来自"F|Phe"
您希望得到"Phe"
,这就是为什么海报需要split
。你没有那些类型的字符串,所以你不应该使用那部分代码。
我将推荐使用BioPython的joaquin建议,因为它显然是适合这项工作的工具,但出于学习目的:您需要知道的第一件事是您要完成四项任务:
链接答案中的代码不处理第一步。为此,您可以使用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]
为你反转字符串。所以,最后,你打印的是一个字符串,而不是一个列表,因此,没有分裂。