2016-04-05 84 views
0

如何避免我在此函數中遇到的錯誤?我不明白爲什麼我會遇到這個錯誤,我只是想不出一個解決方案。我將不勝感激任何提示!謝謝。我該如何避免'索引超出範圍'錯誤?

def myfunction(p): 
    result = [] 
    count = 1 
    if not p: 
     return result 
    else: 
     if p[0] == p[1]: 
      count + 1 
      return myfunction(p[1:]) 
     else: 
      result += (p[0],count) 
      count = 1 
      return myfunction(p[1:]) 

函數應該返回是這樣的:

myfunction("qqwweerrttyy") 
[("q",2),("w",2),("e",2),("r",2),("t",2),("y",2)] 

的錯誤是:

File "test.py", line 36, in myfunction 
    return myfunction(p[1:]) 
    File "test.py", line 32, in myfunction 
    return myfunction(p[1:]) 
    File "test.py", line 30, in myfunction 
    if p[0] == p[1]: 
IndexError: string index out of range 
+1

什麼是'p'? – cdonts

+0

哈哈對不起,只是修好它 – user1234567

+0

那麼爲什麼這一行:p =「qqwweerrttyy」?如果您收到p作爲arg –

回答

0

因爲你指數p[1]即使p可能包含一個單一的元素;你必須確保p[1]存在。你可能也想說count += 1,而不是count+1,它似乎沒有在你給的代碼中做任何工作。 (我假設countresult是全局變量,否則代碼是沒有意義的。)

這裏有一個工作代碼:

count = 1 
result = [] 
def myfunction(p): 
    global count 
    global result 
    if not p: 
     return result 
    else: 
     if len(p) >= 2 and p[0] == p[1]: # Make sure p[1] exists 
      count += 1 
      return myfunction(p[1:]) 
     else: 
      result += (p[0],count) 
      count = 1 
      return myfunction(p[1:]) 

例如,給定字符串"lllalala"時預期的輸出:

>>> myfunction("lllalala") 
['l', 3, 'a', 1, 'l', 1, 'a', 1, 'l', 1, 'a', 1] 
0

與你的功能,你問的一個,第一個問題是:你是否p是空的,但你訪問兩個元素p[0]p[1]。您需要檢查p是否有至少兩個元素,然後才能訪問p[1]

if len(p) < 2: 
    return result 
else: 
    if p[0] == p[1]: 
     ... 

修復此問題後,您會發現下一個錯誤。

+0

看來你引入了一個bug:在這種情況下,最後一個字母不會被記錄下來。 – blazs

+0

@blazs只有排序。無論函數總是返回一個空列表,因爲沒有任何中間結果是返回值的一部分(永遠)。 :)通過使用全局變量而不是純遞歸來改變語義,這隱藏了這個錯誤。 – dsh

+0

夠公平的。 :-) – blazs