Python 我很难理解为什么字符串索引超出范围
我试图检查给定单词中字母重复的程序,但是,当单词有多个相同字母时,例如“hello”有多个“l”,程序会打印一个错误,说明字符串索引超出范围,我很好奇为什么会这样。 我已经看了其他的线索,但我仍然好奇为什么会这样。 循环的底部是问题所在的位置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
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,抱歉,我可能有点迟钝,因为我问过你会发生什么,但实际上并没有提供一个明确的解决方案。现在就修好了。根据您的“首次出现”问题,否,它将替换右侧的每个出现,因为。。范围
循环。谢谢