改进 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