2012-04-01 77 views
0

我寫了一小段代碼,應該檢測2個字符串中是否有相同位置的任何匹配字符。如果有,則將得分加1,如果有兩個或更多連續匹配字符,則得分增加3,如果沒有匹配的字符,則得分遞減1. 問題是,當我嘗試運行代碼,它給了我一個錯誤:字符串索引超出範圍。 什麼可能是錯誤的?非常感謝你。while while循環中的字符串比較

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

「什麼可能是錯的?」你自己說過「串指數超出範圍」。不要誤解我的意思我明白這是作業,但谷歌是你的朋友,現在是時候讓你的調試技巧能夠正常運行了 – 2012-04-01 22:11:34

+0

對不起,我不知道這個錯誤的含義。據我所知,這意味着如果一個字符串是8個字符長,索引是[8],則會發生錯誤。但是,在我的代碼中,索引不會超過字符串的長度。 – geekkid 2012-04-01 22:15:02

+0

@geekkid:看到我的答案。您正在索引字符串的長度。 – 2012-04-01 22:18:31

回答

0

索引編號爲0至n。

len(someString) 

會給你的n + 1

假設你的字符串是長度10,索引是0,1,2,3,4,5,6,7,8,9

你的while循環檢查計數的條件是< 10.到目前爲止這麼好。

好吧,現在讓我們假設計數等於9.立即在第一個while循環內,您遞增計數。

所以現在算= 10

現在試圖訪問someString [計]會給你一個IndexError因爲指數只上升至9。

1

這兩個字符串的長度是否相同?否則,你應該考慮使用類似:

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

+0

是的,這兩個字符串應該有相同的長度。但不是那麼少,謝謝你的評論,因爲我甚至不知道min函數存在:D。 – geekkid 2012-04-01 22:17:22

0

錯誤消息說,:你試圖訪問一個字符超出你的字符串的邊界。試想一下:

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

現在,當(在第一while循環的開始)count是1以下len(seqA),那麼你就遞增count,然後你做seqA[count]這將拋出此異常。

讓我們假設你打電話pairwisescore("a", "a")

score = 0 
count = 0 
while count < len(seqA):     # 0 < 1 --> OK 
    if seqA[count] == seqB[count]:   # "a" == "a" --> OK 
     score = score + 1     # score = 1 
     count = count + 1     # count = 1 
     while seqA[count] == seqB[count]: # seqA[1] doesn't exist! 
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)): 
0

在第二個while循環必須測試計數小於LEN(seqA):

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

和,也有其他可能的錯誤:如果seqB的長度小於長度seqA,你會再次看到運行時異常。所以,你應該改變count < len(seqA)count < min(len(seqA), len(seqB))的每一次發生。

0

的問題是,你這樣做:

count = count + 1 

兩個內while循環之前,在它的結束。但是,在再次檢查len(seqA)之前,您繼續使用seqA[count] - 因此,一旦它變得太高,Python將嘗試讀取seqA的末尾,並且您會看到該錯誤(如果在檢查條件後再次檢查遞增,循環將結束)。

使用Python的for循環將得到解決這樣的錯誤,因爲Python會爲你管理count

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

您可以隨時追蹤輕鬆實現額外的點位在此是否以前字符是匹配的,而不是試圖找出這個之後有多少個。你保持更新的布爾變量last_matched將有助於此。

1

此外,zip函數可能在這裏派上用場來配對每個單詞中的字母。這是一個python builtin。例如

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