2017-02-06 3 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

?要するに、guessedを単独で使用してインデックスを作成しようとしていないはずです。ところで


あなたの入力が異なるケースを処理するためにあなたの試みは立派ですが、あなたは(guessed.lower()を使用していない)、前述の第3のラインと、その中に少なくとも小さな穴を残してきました。

大文字小文字を入力したまま大文字に変換し、それを一貫して保存する方がよいでしょう。そうすれば、比較は自動的に正しいでしょう。


そして、最後の注意点、更新right文字列を出力し、あなたのprint文はhelloまたはMississippiのような言葉は、特定の推測のための出力の多くをもたらすことが起こっていることを意味内でループが起こっています。あなたの目的は、現在の文字のすべて発生が追加された後に新しい結果をプリントアウトする場合

は、単にだけでなく、前節で提案追加変更で、ループの外にのようなものを(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))]) 

読者がその仕組みを理解するための練習として残しておきます。一度あなたはそれをgrok、おそらく自分自身を真のPythonistaと考えることができます:-)

+0

これは、文字の最初の出現/インデックスのみを置き換えることを意味しますか? – Veyronvenom1200

+0

これは、インデックス0を超える文字にインデックスを付けることができないため、ほとんどの場合、範囲外になることを意味します。 – synchronizer

+0

だから、私はただそれを削除する必要がありますか? – Veyronvenom1200

0

私がコメントするのに十分な担当者を持っていません。 この問題を解決する方法は次のとおりです。 問題のサイズを小さくします。私はたくさんのコードを見て、それほど質問はしません。最初に問題を理解する必要があります。可能な限り少ないコード行でエラーを再現できるようになるまで、これを新しいウィンドウに貼り付けてください。それでも問題が解決しない場合は、各オブジェクトの参照資料とメソッドを呼び出して呼び出します。

+0

私はどこに問題があるか知っています。私はちょうどあなたがそれを見たときに人々が参照を持っているように多くのコードを与えた – Veyronvenom1200

-1

私はあなたの問題はここにあると思います:右[i + 1:] 最後の要素にいる場合、インデックスから範囲外のエラーが出ます。 guessedは単一の文字である場合、あなたはguessed[i]を使用するときに、あなたのループ内で何が起こるかを期待します

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) 

:コードセグメントの再

+0

私はまだ範囲外のインデックスを取得しています。その文字の複数のインスタンスがある場合にのみ問題があります – Veyronvenom1200

+0

もう1つの問題はインデックスカーとして使用するための最初と2番目のようです。最初のものをjに変更できますか? –

+0

最初と2番目は、forのネストを意味します。 –

関連する問題