while循环中的字符串比较

时间:2012-04-01 22:07:33

标签: python

我写了一小段代码,可以检测2个字符串中同一个地方是否有匹配的字符。如果有,则分数增加1,如果有2个或更多连续匹配字符,则分数增加3,如果没有匹配字符,则分数减1。 问题是,当我尝试运行代码时,它给了我一个错误:字符串索引超出范围。 可能有什么问题?非常感谢你。

def pairwiseScore(seqA, seqB):
    count = 0
    score = 0
    while count < len(seqA):
        if seqA[count] == seqB[count]:
            score = score + 1
            count = count + 1
            while seqA[count] == seqB[count]:  # This is the line the error occurs
                score = score + 3
                count = count + 1 
        elif seqA[count] != seqB[count]:
            score = score - 1
            count = count + 1
    return score

7 个答案:

答案 0 :(得分:1)

两个字符串的长度是否相同?否则你应该考虑使用类似的东西:

while count < min(len(seqA), len(seqB)):

答案 1 :(得分:1)

此外,zip功能可能会派上用场,以配对每个单词中的字母。这是一个python builtin。 e.g。

def letter_score(s1, s2):
    score = 0
    previous_match = False

    z = zip(s1, s2)
    for pair in z:
        if pair[0] == pair[1]:
            if previous_match:
                score += 3
            else:
                score += 1
                previous_match = True
        else:
            score -= 1
            previous_match = False
    return score

答案 2 :(得分:0)

错误消息说明了:您正在尝试访问超出字符串边界的字符。考虑一下:

>>> s = "hello"
>>> len(s)
5
>>> s[4]
'o'

现在当(第一个while循环开始时)count低于len(seqA)时,您正在递增count,然后您正在进行{ {1}}将抛出此异常。

我们假设您正在调用seqA[count]

pairwisescore("a", "a")

答案 3 :(得分:0)

def pairwiseScore(seqA, seqB):
    count = 0
    score = 0
    isOne = False
    isTwoOrMore = False
    while count < min(len(seqA), len(seqB)):
        if seqA[count] == seqB[count]:
            if isTwoOrMore:
                score = score + 3
                count = count + 1
            else:
                if isOne:
                    isTwoOrMore = True
                score = score + 1
                count = count + 1
                isOne = True
        elif seqA[count] != seqB[count]:
            score = score - 1
            count = count + 1
            isOne = False
            isTwoOrMore = False
    return score

a = 'apple'
b = 'aplle'
print(pairwiseScore(a, b))

我认为这个解决了问题,我添加了一个“计数”bool变量。为了回答这个问题,你的程序没有比较第二个字符串的长度。

while count < min(len(seqA), len(seqB)):

答案 4 :(得分:0)

在第二个while循环中,您必须测试该计数小于len(seqA):

while count < len(seqA) and seqA[count] == seqB[count]:
   ...

并且,还有其他错误:如果seqB的长度小于seqA的长度,您将再次看到运行时异常。因此,您应该使用count < len(seqA)更改count < min(len(seqA), len(seqB))的每次出现。

答案 5 :(得分:0)

索引的编号为0到n。

len(someString)

会给你n + 1。

假设您的字符串长度为10,索引为0,1,2,3,4,5,6,7,8,9

你的while循环检查计数是&lt; 10.到目前为止一切顺利。

好了,现在让我们说count等于9.在第一个while循环中,你会增加计数。

所以现在数= 10。

现在尝试访问someString [count]会给你一个IndexError,因为索引只会达到9。

答案 6 :(得分:0)

问题在于你这样做:

    count = count + 1

在内部while循环之前和结尾之前。但是,在再次检查seqA[count]之前,您继续使用len(seqA) - 因此,一旦它过高,Python将尝试读取seqA的结尾,您将获得该结果错误(如果在递增后再次检查条件,则循环将结束)。

使用Python for循环可以解决这样的错误,因为Python将为您管理count

for a,b in zip(seqA, seqB):
     if a == b:
        score += 1

您可以通过跟踪上一个字符是否匹配来轻松实现额外点位,而不是尝试计算之后的多少一个是。您不断更新的布尔变量last_matched将有助于此。