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

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