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