Python 我很难理解为什么字符串索引超出范围

Python 我很难理解为什么字符串索引超出范围,python,Python,我试图检查给定单词中字母重复的程序,但是,当单词有多个相同字母时,例如“hello”有多个“l”,程序会打印一个错误,说明字符串索引超出范围,我很好奇为什么会这样。 我已经看了其他的线索,但我仍然好奇为什么会这样。 循环的底部是问题所在的位置 right ="" guess="" attempts = 6 tries = 0 print("Hangman: guess letters until you can guess the word or phrase.") print("In thi

我试图检查给定单词中字母重复的程序,但是,当单词有多个相同字母时,例如“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)

我想你的问题在这里:对[I+1:]
如果您在最后一个元素中,它将给出索引超出范围的错误

我想你的问题在这里:对[I+1:] 如果您在最后一个元素中,它将给出索引超出范围的错误

Re代码段:

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
字符串,这意味着像
hello
Mississippi
这样的单词将导致大量输出,用于某些猜测

如果您的目的是在添加了所有当前字母后打印出新结果,只需将
print
移动到循环外部,类似于(以及上一节中建议的添加更改):


当然,几乎总是有一种更为类似于蟒蛇的方式:

right = "".join([right_str[i] if right_str[i] == guessed else right[i] for i in range(len(right_str))])
我将把它留作练习,让读者了解它是如何工作的。一旦你了解了这一点,你就可以认为自己是一个真正的PythOnista:-(<)/P> < P>代码段:

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
字符串,这意味着像
hello
Mississippi
这样的单词将导致大量输出,用于某些猜测

如果您的目的是在添加了所有当前字母后打印出新结果,只需将
print
移动到循环外部,类似于(以及上一节中建议的添加更改):


当然,几乎总是有一种更为类似于蟒蛇的方式:

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


我将把它留作练习,让读者了解它是如何工作的。一旦你了解了这个问题,你可能会认为自己是一个真正的PythOnista:——

IM仍然在索引范围之外。在处理要替换的单个字符时没有问题,只有当该字符有多个实例时才有问题另一个问题似乎是将I用作索引卡的第一个和第二个问题。例如,你能把第一个改成j吗?我说的第一个和第二个是嵌套的for。而且,对这种连接的猜测似乎很奇怪。我想这应该只是猜测。我想你会发现,虽然
“hello”[9999]
确实会产生错误,
“hello”[9999:
(带冒号)工作正常,给你一个空字符串。我仍然得到超出范围的索引。在处理要替换的单个字符时没有问题,只有当该字符有多个实例时才有问题另一个问题似乎是将I用作索引卡的第一个和第二个问题。例如,你能把第一个改成j吗?我说的第一个和第二个是嵌套的for。而且,对这种连接的猜测似乎很奇怪。我想这应该只是猜测。我想你会发现,虽然
“hello”[9999]
确实会产生错误,
“hello”[9999:
(带冒号)工作正常,给你一个空字符串。这是否意味着它只会替换字母的第一个外观/索引?这意味着你不能索引到索引0以外的字符,所以大多数时候你都会越界。那么,我应该删除它吗?@user7433120,对不起,我可能有点迟钝,因为我问了你会发生什么,但实际上没有提供一个明确的解决方案。现在就修好了。根据您的“首次出现”问题,否,它将替换
右侧的每个出现,因为。。范围
循环。感谢您的澄清!你的解决方案奏效了,但我似乎得到了两份打印件。第一个是l,第二个是ll。有没有办法忽略第一个?可能是循环?这是否意味着它将只替换字母的第一个外观/索引?这意味着您无法索引到索引0之外的字符,因此大多数情况下您将超出范围。所以,我应该删除它?@user7433120,抱歉,我可能有点迟钝,因为我问过你会发生什么,但实际上并没有提供一个明确的解决方案。现在就修好了。根据您的“首次出现”问题,否,它将替换
右侧的每个出现,因为。。范围
循环。谢谢