为什么我的代码搜索不存在的索引?

问题描述 投票:0回答:1

在解释之前,如果您玩过在线游戏 Wordle,这会更有意义,因为我正在尝试使用 Python 3 中的 AI 插件重新创建它。

我让玩家输入一个 5 个字母的字符串,该字符串被拆分为一个 5 个项目列表,以及一个代表单词的 5 个字母字符串,该字符串被拆分为一个 5 个项目列表。

当检查猜测中的“黄色”字母时,我的程序将用“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

正是这行代码:word[word.index(guess[y])] = 1,这给我带来了一些问题。 这只会给我带来大约五分之二的问题,但是这段代码在程序过程中运行了 6 次,而且每次几乎都会崩溃。它给了我错误消息:

IndexError:列表索引超出范围

有时:

值错误:0 不在列表中

我没有识别出任何错误消息,所以,当然,我在这里查找了它们。所有答案似乎都不适用于我的问题,并且调试实际上没有任何作用。它似乎只是随机损坏,我不知道为什么,但它发生得太频繁,不容忽视。

如果有人有任何想法,请告诉我,我已经快要完成这个项目了。

python runtime-error wordle-game
1个回答
0
投票

假设您正在尝试实现类似于 wordle 的功能,则问题是由您替换

word
guess
列表中的字符的方法引起的。当您在第一个代码块中设置
word[y] = 1
guess[y] = 0
时,您正在更改原始列表。因此,在后续迭代中,条件
word.count(character_x) > 0
可能会失败,因为
1
0
是原始单词中的无效字符(假设像 worldle 一样,该单词只包含英文字母 😀)

出现

IndexError: list index out of range
是因为
word.index(guess[y])
正在尝试查找已被
0
替换的字符的索引,而该字符可能不再存在于
word
中。同样,当在
ValueError: 0 is not in list
中找不到
0
(在之前的迭代中设置)时,就会发生
word

要解决此问题,您应该避免直接更改原始列表

word
guess
。相反,使用单独的列表来跟踪匹配的位置(绿色)或在单词的其他位置找到的位置(黄色)。尝试这样的事情:

  1. 初始化一个新列表,比如
    matched
    ,长度与
    word
    guess
    相同,填充为
    False
  2. 首先,将
    matched
    中的所有绿色位置(完全匹配)标记为
    True
  3. 然后,对于黄色检查,仅考虑
    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
© www.soinside.com 2019 - 2024. All rights reserved.