迭代字典
问题描述:
在下面的代码中,我试图循环变量“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)
答
这是一个简单的解决方案。我认为计算其他字母对的偏斜很有用,所以我也加了这个。
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,n)的'应该是'范围(N)'。 0是多余的。 – gil
顺便说一下,它也会检测到这个错误。 – JulienD