2017-06-08 104 views
1

我正在嘗試編寫一個Python程序,該程序將採用任何小寫字母的字符串並返回其中最長的字母順序字符串。以下是一段代碼。While循環中的Python範圍錯誤

s="abc"           #sample string 
anslist=[]           #stores answers 
shift=0           #shifts substring 
expan=0           #expands substring 
while len(s) >= 1+shift+expan:      #within bounds of s 
    if s[0+shift+expan] > s[1+shift+expan]:  #if not alphabetical 
     shift += 1         #moves substring over 
    else:           #if alphabetical 
     while s[0+shift+expan] <= s[1+shift+expan]: #while alphabetical 
      expan += 1        #checks next letter 
     anslist += s[0+shift:2+shift+expan]  #adds substring to ans 
     expan = 0         #resets expansion 

當運行該代碼,含有 而S [0 +移+ EXPAN] < = S [1 +移+ EXPAN]的行: 創建錯誤該字符串索引是該範圍以外的。我發現加入expan會使索引超出範圍,但不應該用最大的while循環解決這個問題嗎?我感謝任何幫助。

+0

這很可能是一次錯誤。因爲len將比最後一個基於0的索引大1,所以while條件不應該是len(s)> 1 + shift + expan嗎? –

+0

@ 0101001101000010這不會解決它仍然會出界的錯誤。 's'有一個len長度爲'3',但由於最大索引是'len(object)-1'和'shift + expan> 0',所以你只能索引到2。 – Pythonista

+0

'S [0 +移+ EXPAN] <= S [1 +移+ EXPAN]'是對於b真和c,從而然後EXPAN是+ = 1,並且超出了範圍,應添加像'的檢查和擴大+ 1 + 1 + shift depperm

回答

1

首先,爲什麼你的代碼不起作用:

  • 你是不是保護您的內環反對跑掉字符串末尾
  • 「保存」子字符串時,您的索引已關閉
  • +=anslist,這是不是你的字符串添加到列表
  • 你不處理子後遞增shift,所以當它清除expan它相同指數重新開始,並永遠循環

固定碼(內聯註釋解釋的變化):

s="abckdefghacbde"         #sample string 
anslist=[]           #stores answers 
shift=0           #shifts substring 
expan=0           #expands substring 
while len(s) > 1+shift+expan:      #within bounds of s 
    if s[0+shift+expan] > s[1+shift+expan]:  #if not alphabetical 
     shift += 1         #moves substring over 
    else:           #if alphabetical 
     # Added guard for end of string 
     while len(s) > 1 + shift + expan and  # While still valid 
       s[0+shift+expan] <= s[1+shift+expan]:# While alphabetical 
      expan += 1        #checks next letter 
     # Fixed string sublength and append instead of += 
     anslist.append(s[0+shift:1+shift+expan]) #adds substring to ans 
     # Continue to next possible substring 
     shift += expan        # skip inner substrings 
     expan = 0 
print anslist 

結果:

['abck', 'defgh', 'ac', 'bde'] 

所以最後一步是找到長度最長的那一個,我將留給你,因爲這看起來像作業。

要回答這個問題:

我看到增加EXPAN將使指數超出範圍,但不應最大while循環解決這個問題?

它可以防止您的起始子字符串索引脫離,但不會擴展。你必須保護兩種可能性。

+0

我已經在這段代碼上工作了兩天,很高興終於找到錯誤是什麼。非常感謝您的詳細回覆,並感謝大家對這個問題的貢獻! –

+0

@GradyMorrissey未來,請包含堆棧跟蹤,因爲它可以更容易地識別具體問題。另外,我建議你先看看[PEP-8](https://www.python.org/dev/peps/pep-0008/),因爲有一些重要的樣式問題會讓你的代碼難以閱讀。話雖如此,不要氣餒。每個人都會犯錯。 – TemporalWolf

0

看看這個。

>>> import re 
>>> words = [] 
>>> word = r'[a]*[b]*[c]*[d]*[e]*[f]*[g]*[h]*[i]*[j]*[k]*[l]*[m]*[n]*[o]*[q]*[r]*[s]*[t]*[u]*[v]*[x]*[y]*[z]*' # regex that would match sub-strings. Just extend it up to z. 
>>> string = "bacde" 
>>> for m in re.finditer(word, string): 
...   words.append(m.group()) 
>>> print(words) # list of substrings 
['b', 'acde'] 

然後你就可以從字符串列表中提取最大的字符串

>>> print(max(words, key=len)) 
acde 
+0

我認爲他需要像''abc「'或'」def「'這樣的字母,而不僅僅是字母字符。 – TemporalWolf

+0

看到他說按字母順序排列的子串。我評論說他不清楚他想要什麼。他應該給一個預期的輸出abc不會削減! – Djokester

+1

@Djokester對不起,我感到困惑。對於s =「abc」,預期的輸出是「abc」。同樣,對於s =「bac」,預期輸出爲「ac」。 –