2016-04-05 20 views
0

Bu işlevin aldığım hatayı nasıl önleyebilirim? Bu hatayı neden aldığımı anlamıyorum, bir çözüm düşünemiyorum. Ben herhangi bir ipucu için çok minnettarım! teşekkür ederim.'İndeks aralık dışı' hatasını buradan nasıl önleyebilirim?

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:]) 

fonksiyonu böyle bir şey dönmelidir:

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

hatadır:

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

Ve p nedir? – cdonts

+0

hahah Üzgünüz, – user1234567

+0

var mı o zaman neden bu satır: p = "qqwweerrttyy"? p olarak arg –

cevap

0

Çünkü endeksi p tek eleman içerebilir bile p[1]; p[1]'un var olduğundan emin olmalısınız. Muhtemelen count += 1, count+1 değil, vermek istediğiniz kodda herhangi bir iş yapmak gibi görünmüyor. (Ben count ve result tahmin ediyorum genel değişkenlerdir, aksi takdirde kod anlam ifade etmiyor.)

İşte bir çalışma kod: dize "lllalala" verildiğinde

Örneğin
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:]) 

, çıkış beklendiği gibi: p boş olup olmadığını kontrol ederiz, ancak daha sonra iki öğe p[0] veeriş:

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

senin işlevi hakkında sorulan biriyle ilk sorun şudur. 'a erişebilmek için p'un en az iki öğeye sahip olduğunu kontrol etmeniz gerekir.

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

Bunu düzelttikten sonra bir sonraki hatayı bulacaksınız.

+0

Görünüşe göre bir hata çıkarmışsınız: Bu davada son harf kaydedilmeyecek. – blazs

+0

@blazs Sadece sıralama. Bundan bağımsız olarak, her zaman ara sonuçların hiçbiri dönüş değerinin (hiç) bir parçası olmadığından, işlev her zaman boş bir liste döndürür. :) Semantiği, bu hatayı saklayan saf özyineleme yerine global değişkenler kullanarak değiştirdiniz. – dsh

+0

Yeterince adil. :-) – blazs

İlgili konular