在Python中改进字符串的三分之一迭代

2024-09-30 01:28:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我必须获得一个字符串输入(在本例中是一个DNA密码子序列)并打印出序列中相应的SLC作为输出(例如输入:ATT输出:I)。我目前的代码可以实现这一点,但我想它也迎合了序列的长度不是3整除和输出'X'为那些(例如输入:ATOP输出: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])

上述输出为:

五 我 F级

所以我希望'PY'按照else语句输出为'X',但它的长度不能被3整除。也希望输出为:VIFX。你知道吗


Tags: or字符串代码序列elseatttranslatedna
3条回答

首先,最好将与一个输出字母相关的所有可能性放入一个列表中,并检查您的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循环或类似的循环。他说

这里有一些东西使事情主要是数据驱动的,这通常是一件好事,因为它使事情更容易调试和维护。他说

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

因此,最好使用biopythonhttp://biopython.org/

from Bio.Seq import Seq
seq = Seq('GTTATCTTT')
print(seq.translate())

你得到了

VIF

相关问题 更多 >

    热门问题