我必须接受一个字符串输入(在这种情况下是DNA密码子序列)并打印出序列中存在的相应SLC作为输出(例如输入:ATT输出:I)。我当前的代码可以实现这一点但是我希望它也能满足不能被3整除的长度的序列,并为那些输出'X'(例如输入:ATTOP输出:IX。还有一种方法可以得到结果打印在一行而不是多行?
DNA = 'GTTATCTTTPY'
def translate(DNA):
if DNA == 'ATT' or DNA == 'ATC' or DNA == 'ATA':
print 'I'
elif DNA == 'CTT' or DNA == 'CTC' or DNA == 'CTA' or DNA =='CTG' or DNA == 'TTA' or DNA == 'TTG':
print 'L'
elif DNA == 'GTT' or DNA == 'GTC' or DNA == 'GTA' or DNA == 'GTG':
print 'V'
elif DNA == 'TTT' or DNA == 'TTC':
print 'F'
elif DNA == 'ATG':
print 'M'
else :
print "X"
for i in range(3, len(DNA) + 1, 3):
translate (DNA[i-3:i])
上面的输出是:
V 一世 ˚F
所以我希望'PY'按照其他声明输出为'X',但它的长度不能被三整除。也希望输出为:VIFX。
答案 0 :(得分:1)
首先,最好将连接到一个输出字母的所有可能性放入列表中,并检查您的DNA
变量是否为in
这样的列表。它看起来更整洁。
它可能看起来像:
if DNA in ['ATT', 'ATC', 'ATA']:
print 'I'
而不是:
if DNA == 'ATT' or DNA == 'ATC' or DNA == 'ATA':
print 'I'
如果你想让所有字母都在一行中,你可以使用一个变量,只需在其中添加字母并在分析完整个DNA代码后打印出来。
def translate(DNA):
output = ''
if DNA in ['ATT', 'ATC', 'ATA']:
output += 'I'
...
打印' X'当你得到少于3个字母或任何其他组合时,使用while
循环可能更好。
您的代码可能就像这样:
def translate(DNA)
output = ''
while DNA: #it's the same as while DNA != ''
three_letters = DNA[:3] #you should come up with better name ;)
DNA=DNA[3:]# in Python 3 this works even if DNA has less than 3 letters, hope it works in Python 2 too
if three_letters in ['ATT', 'ATC', 'ATA']:
output += 'I'
... #here code all elifs and else inside while loop
print output
这样你只需要为函数提供参数来获得结果,不需要外部for
循环等。
答案 1 :(得分:1)
为此,最好使用biopython
http://biopython.org/
from Bio.Seq import Seq
seq = Seq('GTTATCTTT')
print(seq.translate())
你明白了,
VIF
答案 2 :(得分:0)
这些东西主要是数据驱动的,这通常是一件好事,因为它使调试和维护更简单。
xlate_map = {
'I': ('ATT', 'ATC', 'ATA'),
'L': ('CTT', 'CTC', 'CTA', 'CTG', 'TTA', 'TTG'),
'V': ('GTT', 'GTC', 'GTA', 'GTG'),
'F': ('TTT', 'TTC'),
'M': ('ATG')
}
# build a translation table from mapping
xlate_table = {}
for code, values in xlate_map.items():
for value in values:
xlate_table[value] = code
def grouper(n, sequence):
"""s -> (s0,s1,...sn-1), (sn,sn+1,...s2n-1), (s2n,s2n+1,...s3n-1), ..."""
for i in xrange(0, len(sequence), n):
yield sequence[i:i+n]
def translate(DNA):
res = (xlate_table.get(seq, 'X') for seq in grouper(3, DNA))
return ''.join(res)
print(translate('GTTATCTTTPY')) # -> VIFX