迭代字典

时间:2016-02-14 01:07:22

标签: python loops for-loop

在下面的代码中,我试图循环变量“Genome”,其中包含一段遗传密码。我正在初始化一个存储在变量“skew”中的数组,它保持了遗传字母的运行得分。例如,每次遇到“C”时我都希望skew [i]等于skew [i-1] -1,并且每次遇到“G”时我都希望skew [i]等于skew [i-1] +1。所以我基本上在一段遗传密码中保持G与C之比的得分。当我运行下面的代码时,我得到“Keyerror:23”。我知道Python在无法访问dict项目但是我不知道如何修复我的代码时抛出了一个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) 

3 个答案:

答案 0 :(得分:1)

您应该将skew = {}更改为skew = []以初始化列表而不是字典。

为确保所有skew[j]无法访问列表边界,您可以初始化skew,如

skew = [0] * n

答案 1 :(得分:1)

for j in (1,n):您遗失了range。所以j立刻取值24并且你的代码中断了(j-1 = 23还没有在dict中)。更改为for j in range(1,n)

答案 2 :(得分: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