在Python中改进三次字符串的迭代

时间:2017-01-19 13:56:26

标签: python iteration bioinformatics

我必须接受一个字符串输入(在这种情况下是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。

3 个答案:

答案 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