我写了一小段代码,可以检测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
答案 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
将有助于此。