迭代字典

迭代字典

问题描述:

在下面的代码中,我试图循环变量“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

你应该改变skew = {}skew = []初始化列表,而不是一本字典。

并确保所有skew[j]不访问列表中进行边界的,你可以初始化skew

skew = [0] * n 
+0

然后,它会只是说“列表索引超出范围”对于喜欢“歪斜[J] =歪斜[J-1] -1 ” – eni

+0

添加了有关如何初始化一个足够大名单。 – timrau

+0

虽然我同意列表的使用,但这只会让错误更难以发现。也许初始化为None而不是0,这样如果缺少一个条目就更可能产生错误:'[None] * n'。 – JulienD

for j in (1,n):你缺少range。所以j马上取值24,你的代码中断(j-1 = 23还没有在字典中)。更改为for j in range(1,n)

+0

谢谢。我瞎了 – eni

这是一个简单的解决方案。我认为计算其他字母对的偏斜很有用,所以我也加了这个。

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