2017-01-18 63 views
1

我需要創建一個函數,返回給定的DNA序列中的互補序列。例如,如果你用'AT'作爲參數來調用這個函數,它應該返回'TA'。但是如果DNA序列可以有任何長度,我真的不知道如何創建它。如果互補核苷酸是A = T G = C,我如何開發一個返回互補序列的函數。 首先,我有想法創建一個循環,以創建它,但我卡住了。卡在python 3循環

這是我最初的代碼:

def get_complementary_sequence(sequence): 
    """ (str) --> str 
    Return the DNA sequence that is complementary to the given DNA sequence 
    >>> get_complementary_sequence('AT') 
    'TA' 
    >>> get_complementary_sequence('GC') 
    'CG' 
    """ 

    for char in sequence: 
     if char in 'ATCG': 
      sequence = sequence + 1 
+2

不要修改你迭代 – Daenyth

+0

你爲什麼要加1序列的價值呢? – Seraf

回答

1

怎麼樣?這是一個非常骯髒的解決方案,但不會把戲

def get_complementary_sequence(sequence): 
    mp = {"A":"T", 
      "T":"A", 
      "C":"G", 
      "G":"C"} 

    return ''.join(mp[c] for c in sequence) 

另外請注意,這僅適用如果序列只包含A,T,C或G

+0

爲什麼你認爲這是一個「非常髒」的解決方案?對我來說看起來很合理。 (爲了提高內存效率,請刪除方括號,以便使用生成器表達式而不是列表理解:'''.join(mp [c] for c in sequence)') –

+0

將'mp'從函數中提取出來這是一個常量,每次調用該函數時都會創建相同的「dict」。 – oblalex

+0

感謝advie,@ das-g。我經常忘記那些細節...... –

1

在這裏,我們走了。您可以在人性化的方式配置PAIRS

from itertools import permutations, chain 

PAIRS = [ 
    ('A', 'T'), 
    ('G', 'C'), 
] 
COMPLEMENTATIONS = { 
    k: v 
    for k, v in 
    chain(*chain(list(itertools.permutations(p)) for p in PAIRS)) 
} 

def get_complementary_sequence(sequence): 
    return ''.join(map(COMPLEMENTATIONS.get, sequence)) 

用法:

get_complementary_sequence('ATGCCGTAATTTCGCA') 
'TACGGCATTAAAGCGT' 
+0

這看起來比我的更容易 –