改进 Python 中三个字符串的迭代
Improving an iteration over a string in threes in Python
我必须输入字符串(在本例中为 DNA 密码子序列)并打印出序列中存在的相应 SLC 作为输出(例如 input:ATT output:I)。我当前的代码可以实现这一点,但我希望它也能满足长度不能被 3 整除的序列,并为那些输出 'X'(例如 input:ATTOP output: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' 按照 else 语句输出为 'X' 但它的长度不能被三整除。还希望输出为:VIFX.
首先,最好将与一个输出字母相关的所有可能性放入一个列表中,并检查您的 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'
...
要在少于 3 个字母或任何其他组合时打印 'X',最好使用 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
循环等。
主要是data-driven这通常是一件好事,因为它使调试和维护变得更简单。
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
为此最好使用biopython
http://biopython.org/
from Bio.Seq import Seq
seq = Seq('GTTATCTTT')
print(seq.translate())
你明白了,
VIF
我必须输入字符串(在本例中为 DNA 密码子序列)并打印出序列中存在的相应 SLC 作为输出(例如 input:ATT output:I)。我当前的代码可以实现这一点,但我希望它也能满足长度不能被 3 整除的序列,并为那些输出 'X'(例如 input:ATTOP output: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' 按照 else 语句输出为 'X' 但它的长度不能被三整除。还希望输出为:VIFX.
首先,最好将与一个输出字母相关的所有可能性放入一个列表中,并检查您的 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'
...
要在少于 3 个字母或任何其他组合时打印 'X',最好使用 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
循环等。
主要是data-driven这通常是一件好事,因为它使调试和维护变得更简单。
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
为此最好使用biopython
http://biopython.org/
from Bio.Seq import Seq
seq = Seq('GTTATCTTT')
print(seq.translate())
你明白了,
VIF