2016-11-26 117 views
2

我经常可以解答老师给我的练习,尽管并不总是最“pythonic”的。任何人都可以改进我的代码也许'if'陈述可以写在较少的行上?这可以写成更多'pythonic'吗?

def omgekeerdComplement(string): 
    """ 
    Writes the complement and the reverse of the given DNA string 

    >>> omgekeerdComplement('GATATC') 
    'GATATC' 
    >>> omgekeerdComplement('GCATGC') 
    'GCATGC' 
    """ 

    newstr = '' 
    for i in range(0, len(string)): 
     if string[i] == 'G': 
      newstr += 'C' 
     elif string[i] == 'C': 
      newstr += 'G' 
     elif string[i] == 'A': 
      newstr +='T' 
     else: 
      newstr += 'A' 
    return str(newstr[::-1]) 

if __name__ == "__main__": 
    import doctest 
    doctest.testmod() 

干杯!

+0

*写*补充 - 显示输入字符串和预期的结果 – RomanPerekhrest

+3

你的测试用例是真正奇怪的 - 你只选择那些在输出是一样的输入! –

+1

如果这是您认为可以改进的**工作代码**,请参见[codereview.se]。注意你可以用两行来做:'mapping = {'G':'C',...};返回''.join([字符串[:: - 1]中的字符映射[char]])''。 – jonrsharpe

回答

7

它更Python和更好的性能与发电机理解和str.join,使用字典字母对应

def omgekeerdComplement(string): 
    """ 
    Writes the complement and the reverse of the given DNA string 

    >>> omgekeerdComplement('GATATC') 
    'GATATC' 
    >>> omgekeerdComplement('GCATGC') 
    'GCATGC' 
    """ 
    d = {'G':'C','C':'G','A':'T','T':'A'} 

    return "".join(d[c] for c in reversed(string)) 
+0

谢谢,没想到这个! – Roelland

+0

不需要分配给'newstr'! – jonrsharpe

+0

@jonrsharpe编辑出来,你是对的(不创建额外的副本,但仍然,一行太多:)) –

0

我想用一个列表理解会更Python。事情是这样的:

def ComplementAndReverse(string): 
    compliments = { 'G':'C', 'C':'G', 'A':'T', 'T':'A' } 
    return ''.join(compliments[ch] for ch in string[::-1]) 
2

32字节

试图高尔夫这一点。

lambda s:s.translate('TCG.A'*99) 

例子:

>>> fn = lambda s:s.translate('TCG.A'*99) 
>>> fn('ATCG') 
'TAGC'