关于超出范围指数的Python问题

时间:2015-07-01 15:24:03

标签: python

我一直困扰着涉及在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

如何解决此类问题?

2 个答案:

答案 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循环的开头进行检查,以确定您是否处于最后位置。如果是,请不要进行连续序列检查。