提问人:RetroSphere09 提问时间:11/12/2023 最后编辑:halferRetroSphere09 更新时间:11/16/2023 访问量:64
为什么我的代码要搜索不存在的索引?
Why is my code searching for an index that doesn't exist?
问:
在解释之前,如果您玩过在线游戏 Wordle,这将更有意义,因为我正在尝试使用 Python 3 中的 AI 插件重新创建它。
我让玩家输入一个 5 个字母的字符串,该字符串被拆分为 5 个项目列表,以及一个 5 个字母的字符串,表示单词被拆分为 5 个项目列表。然后,它们都被复制为带有行的列表“guessCopy”和“wordCopy”。
guessCopy = guess[:]
wordCopy = word[:]
以确保我不会不可逆转地弄乱单词的数据。
当检查猜测中的“黄色”字母时,我的程序会用“0”或“1”替换单词和猜测中相同的字符,并在此处使用以下代码:
if guess[y] == word[y]:
results[y] = "Green"
word[y] = 1
guess[y] = 0
和
if word.count(character_x) > 0:
results[y] = "Yellow"
word[word.index(guess[y])] = 1
guess[y] = 0
每次运行代码以获取每个字母的颜色结果后,我会将结果添加到列表“results”中,然后将单词恢复到其原始状态。我这样做是为了下次运行它时,我不会在尝试搜索不存在的单词中的“0”或“1”时出错。
正是这行代码:word[word.index(guess[y])] = 1,这给我带来了一些问题。
这只给我带来了大约 2 次/5 次的问题,但是这段代码在程序过程中运行了 6 次,而且每次几乎总是会崩溃。它给了我错误消息:
IndexError:列表索引超出范围
有时:
ValueError: 0 不在列表中
我没有识别任何一条错误消息,所以,当然,我在这里查找了它们。似乎没有一个答案适用于我的问题,调试几乎什么也没做。它似乎只是随机中断,我不知道为什么,但它发生得太频繁了,无法忽视。
答:
假设您正在尝试实现类似于 wordle 的东西,那么问题出在您替换字符和列表中的方法上。您在设置第一个代码块时更改了原始列表。因此,在随后的迭代中,条件可能会失败,因为 并且是原始单词中的无效字符(假设像 worldle 一样,该单词仅包含英文字母😀)word
guess
word[y] = 1
guess[y] = 0
word.count(character_x) > 0
1
0
发生这种情况的原因是,它试图查找已替换为 的字符的索引,该字符可能不再存在于 中。同样,当 中找不到 (在先前迭代中设置) 时会发生。IndexError: list index out of range
word.index(guess[y])
0
word
ValueError: 0 is not in list
0
word
要解决此问题,应避免直接更改原始列表。相反,请使用单独的列表来跟踪匹配的位置(绿色)或单词中其他位置的位置(黄色)。尝试这样的事情:word
guess
- 初始化一个新列表,比如 ,其长度与 和 相同,填充 。
matched
word
guess
False
- 首先,将 中的所有绿色位置(完全匹配)标记为 。
matched
True
- 然后,对于黄色复选,仅考虑对应值为 的字符。
word
matched
False
matched = [False] * len(word) # Initialize matched list
# Check for green letters
for y in range(len(guess)):
if guess[y] == word[y]:
results[y] = "Green"
matched[y] = True
# Check for yellow letters
for y in range(len(guess)):
if not matched[y] and guess[y] in word:
# Find the first unmatched occurrence in word
for w in range(len(word)):
if word[w] == guess[y] and not matched[w]:
results[y] = "Yellow"
matched[w] = True
break
评论
print(y)
print(guess[y])
print(word.index(guess[y]))