2017-02-06 45 views
1

我試圖檢查給定單詞中字母重複次數的程序,但是當單詞具有同一個字母的倍數時,例如'hello'有多個'l',程序打印出一個錯誤,指出字符串索引超出範圍,我很好奇這是爲什麼。 我已經看了其他線程,但我仍然好奇爲什麼這樣。 循環底部是問題所在的位置。我很難理解爲什麼字符串索引超出範圍

right ="" 
guess="" 
attempts = 6 
tries = 0 

print("Hangman: guess letters until you can guess the word or phrase.") 
print("In this game you get six tries.") 

right_str = str(input("\nEnter your word: ")) 

#checks to see if user input is all letters or if there are none letters in the string 
while right_str.isalpha()==False: 
    print("Error, only letters are accepted as an input") 
    right_str = str(input("Enter your word: ")) 

#displays the proper amount of unknown spaces 
for i in range(0, len(right_str)): 
    right += "-" 


print("current: " + right) 
print("0 guesses so far out of 6: " + guess) 

for i in range(0, 6): 
    guessed = str(input("Letter guessed: ")) 

    if guessed.lower() in right_str.lower(): 
     for i in range(0, len(right_str)): 
      if right_str[i] in guessed: 
       right = right[:i] + guessed[i] + right[i + 1:] 
       print(right) 

回答

1

重新代碼段:

if guessed.lower() in right_str.lower(): 
    for i in range(0, len(right_str)): 
     if right_str[i] in guessed: 
      right = right[:i] + guessed[i] + right[i + 1:] 
      print(right) 

如果guessed是一個字母,你能指望什麼在你的循環會發生當您使用guessed[i]?底線,你應該自己使用guessed,而不是試圖索引它。


順便說一句,而你嘗試處理您輸入不同的情況下是難能可貴的,你離開它至少一個小孔以上(不使用guessed.lower())第三行。

您可能會發現將所有內容轉換爲較低(或較高)的情況會更好,因爲它已輸入,並且一致地存儲它。這樣,比較將自動正確。


而且,最後一個音符,你print聲明,輸出更新right字符串發生循環意味着像helloMississippi一個字是要造成大量的某些猜測輸出。

如果你的目的是要打印出後已添加的所有出現當前字母的新結果,只需將print到循環之外,像(與前一節中建議,以及增加的變化):

right_str = str(input("\nEnter your word: ")).lower() 
: 
guessed = str(input("Letter guessed: ")).lower() 
: 
if guessed in right_str: 
    for i in range(0, len(right_str)): 
     if right_str[i] in guessed: 
      right = right[:i] + guessed + right[i + 1:] 
    print(right) 

,當然,還有幾乎總是一個更Python的方式來做到這一點:

right = "".join([right_str[i] if right_str[i] == guessed else right[i] for i in range(len(right_str))]) 

我將讓讀者瞭解它是如何工作的。一旦你瞭解了這一點,你可以認爲自己是一個真正的Pythonista :-)

+0

這是否意味着它只會取代信件的首次出現/索引? – Veyronvenom1200

+0

這意味着你不能索引超過索引0的字符,所以大多數情況下你會超出索引。 – synchronizer

+0

那麼,我應該刪除它? – Veyronvenom1200

0

我沒有足夠的代表發表評論。 以下是你如何解決這個問題: 減少問題的大小。我看到了很多代碼,並沒有太多問題。你首先需要了解問題。複製粘貼到一個新窗口減少,直到你可以用盡可能少的代碼行重現錯誤。如果沒有解決問題,請閱讀您調用的每個對象和方法的參考資料。

+0

我知道問題出在哪裏。我只是給了那麼多的代碼,所以當你看着 – Veyronvenom1200

-1

我認爲你的問題在這裏:right [i + 1:] 如果你在最後一個元素,它會給索引超出範圍的錯誤。

+0

我仍然索引超出範圍時,人們會有一個參考。在處理單個字符替換時沒有問題,只有當該字符有多個實例時纔有問題 – Veyronvenom1200

+0

另一個問題似乎是將我用作索引車的第一個和第二個問題。例如,你可以將第一個改爲j? –

+0

第一和第二我的意思是嵌套的。 –