我一直困扰着涉及在for循环中检查索引i和i + 1的值的问题。但是,这样做会导致IndexError。一种解决方案是使用范围-1,但通常无法检查最后一个索引值。
例如,考虑到以下问题:
编写一个比较两个DNA序列的函数 以下评分方案:匹配+1,每个连续+3 匹配,每次不匹配为-1。
我用以下方式编写了解决方案:
def pairwiseScore(seqA, seqB):
if len(seqA) != len(seqB):
return 'Length mismatch'
count = 0
for i in range(len(seqA)-1):
if seqA[i] == seqB[i] and seqA[i+1] == seqB[i+1]:
count += 3
elif seqA[i] == seqB[i]:
count += 1
else:
count -= 1
#print count
return "Score: {c:d}".format(c=count)
print pairwiseScore("ATTCGT", "ATCTAT")
当我运行时,得分为1.这是因为该程序缺少最后一个索引。如果我打印值,我可以看到这个:
A A
T T
T C
C T
G A
Score: 1
[Finished in 0.1s]
它应该返回2分。
要检查的另一个字符串:
pairwiseScore("GATAAATCTGGTCT", "CATTCATCATGCAA")
这应该得分为4
如何解决此类问题?
答案 0 :(得分:2)
你需要类似的东西
def pairwiseScore(seqA, seqB):
a=len(seqA)
if a != len(seqB):
return 'Length mismatch'
count = 0
for i in range(0,a):
if seqA[i] == seqB[i] and i+1<a and seqA[i+1] == seqB[i+1]:
count += 3
elif seqA[i] == seqB[i]:
count += 1
else:
count -= 1
return "Score: {c:d}".format(c=count)
print pairwiseScore("GATAAATCTGGTCT", "CATTCATCATGCAA")
假设长度相等。列表中的第一个元素从零开始。这就是我使用range(0,a)
的原因。然后,如果i+1<a
等于True
,则表示 seqA[i]
之后有一个元素,因此长度相等时可以使用seqB[i+1]
。
此外,range(0,a)
'计数'从零到a-1
,其中a=len( seqA )
。在Python 2.7.x range
中返回一个肯定会消耗内存的列表。如果len(seqA)
可能是一个非常大的数字,我建议改为使用xrange
。在Python 3.x中,您不需要这样的预防措施。
答案 1 :(得分:0)
这种情况正在发生,因为您只检查第一个len(seq)-1位数。如果要检查所有数字,则需要循环遍历整个范围(len(seq))。为避免出现IndexError,请在for循环的开头进行检查,以确定您是否处于最后位置。如果是,请不要进行连续序列检查。