2016-02-13 61 views
0

我試圖構建一個函數,返回或從字母列表(DNA鹼基)產生k-mers列表。 K代表k-mers的長度(或順序)。使用遞歸從python中的單體列表生成k-mers

我已經做了這個功能,將所需的結果打印到屏幕上。關鍵是我不能讓函數返回這些值。

def function(k,y=''): 
    letters=['A','C','T','G'] 
    if k==0: 
     print(y) 
    else: 
     for m in letters: 
      kmer=m+y 
      function(k-1,kmer) 

我雖然在返回列表或產生k-mers但沒有任何選項的工作。當我更改打印量或返回時,函數返回None。

這可能是一個概念錯誤,我只是理解遞歸函數,因爲我來自生物背景。

在此先感謝。

回答

2

關鍵是在你的遞歸調用(需要Python 3.3+)使用yield from

def function(k, y=''): 
    if k==0: 
     yield y 
    else: 
     for m in ['A','C','T','G']: 
      yield from function(k-1, m+y) 

測試:

>>> [x for x in function(2)] 
['AA', 'CA', 'TA', 'GA', 'AC', 'CC', 'TC', 'GC', 'AT', 'CT', 'TT', 'GT', 'AG', 'CG', 'TG', 'GG'] 
+0

perfe克拉!它也適用於我!爲了更好地理解,我會更多地瞭解一下「產生」。謝謝! –

+0

好的,完成! ;-)雖然我使用python> 3.3,但我已經修改了一下,以適應python <3.3的解決方案。 (k-1,kmer)中的項目:yield item「 –

+0

你可以用函數(k-1,m + y) 1,m + y):例如,產量res'。 – uselpa

0

人們已經展示瞭如何使用屈服,我將展示如何將所有kmers返回到一起(如果k太高並且將會有太多kmers可能是不希望的)

def giveKmers(k): 
    def function(k, y=''): 
     letters = ['A', 'C', 'T', 'G'] 
     if k: 
      for m in letters: 
       function(k - 1, m + y) 
     else: 
      arr.append(y) 

    arr = [] 
    function(k) 
    return arr 


print giveKmers(2)