2016-02-14 169 views
1

在下面的代碼中,我試圖循環變量「Genome」,其中包含一段遺傳密碼。我正在初始化一個存儲在變量「skew」中的數組,這個變量保持了遺傳字母的運行得分。例如,每次遇到「C」時,我想讓skew [i]等於skew [i-1] -1,並且每次遇到「G」時,我希望skew [i]等於skew [i-1] +1。所以我基本上保留了一段遺傳密碼中G與C比值的分數。當我運行下面的代碼時,我得到「Keyerror:23」。我知道當Python無法訪問一個字典項時Python會拋出一個keyerror,但我不知道如何修復我的代碼。請幫忙!!迭代字典

def skew(Genome): 
    skew = {} 
    n = len(Genome) 
    skew[0] = 0 
    for i in range(0,n): 
     #skew[i] = skew[i-1] 
     if Genome[i] == "G": 
      for j in (1,n): 
       skew[j] = skew[j-1]+1 
     elif Genome[i] == "C": 
      for j in (1,n): 
       skew[j] = skew[j-1]-1 
     else: 
      for j in (1,n): 
       skew[j]=skew[j-1] 
    return skew 


Genome="CCGTTCTTCGCTCTAGTTACAGCG" 


print skew(Genome) 
+0

'範圍(0,n)的'應該是'範圍(N)'。 0是多餘的。 – gil

+0

順便說一下,它也會檢測到這個錯誤。 – JulienD

回答

1

你應該改變skew = {}skew = []初始化列表,而不是一本字典。

並確保所有skew[j]不訪問列表中進行邊界的,你可以初始化skew

skew = [0] * n 
+0

然後,它會只是說「列表索引超出範圍」對於喜歡「歪斜[J] =歪斜[J-1] -1 」 – eni

+0

添加了有關如何初始化一個足夠大名單。 – timrau

+0

雖然我同意列表的使用,但這隻會讓錯誤更難以發現。也許初始化爲None而不是0,這樣如果缺少一個條目就更可能產生錯誤:'[None] * n'。 – JulienD

1

for j in (1,n):你缺少range。所以j馬上取值24,你的代碼中斷(j-1 = 23還沒有在字典中)。更改爲for j in range(1,n)

+0

謝謝。我瞎了 – eni

0

這是一個簡單的解決方案。我認爲計算其他字母對的偏斜很有用,所以我也加了這個。

delta是發電機表達式確定的變化(+ 1,-1,0)。 accumulate生成三角洲的運行總和。

import itertools as it 

def skew(Genome, plus="G", minus="C"): 
    delta = (1 if c == plus else -1 if c == minus else 0 for c in Genome) 
    return list(it.accumulate(delta)) 

skew(Genmome) 

返回

[-1, -2, -1, -1, -1, -2, -2, -2, -3, -2, -3, -3, -4, -4, -4, -3, -3, -3, -3, 4, -4, -3, -4, -3] 

編輯 一種等效的Python 2.7溶液:

def skew(Genome, plus="G", minus="C"): 
    delta = [1 if c == plus else -1 if c == minus else 0 for c in Genome] 
    for i in range(1, len(delta)): 
     delta[i] += delta[i-1] 
    return delta 
+0

這可能是一個很好的解決方案,但不幸的是我無法正確地進行測試,因爲它給了我錯誤「'模塊'對象沒有屬性'積累' 」 – eni

+0

我添加了一個等效的Python 2.7解決方案 – RootTwo

+0

謝謝,這很好。我不能贊成你,因爲我的代表是低於15。 – eni