扫描列表 - IndexError:列表索引超出范围

时间:2016-08-02 15:43:33

标签: python indexoutofboundsexception

我创建了一个有一个错误的Hangman游戏:如果你猜两次相同的字母就会破坏它。我创建了一个每个字母表的列表,当玩家猜到该字母时,它将从列表中删除,这将显示可供猜测的剩余字符。这是通过.remove方法完成的,如果已经从之前的猜测中删除了该字符,该方法将会中断。

我试图将此方法嵌套在for循环中,该循环将扫描字母表列表并检查用户对列表中匹配项的猜测并将其删除。如果已经猜到了,那么什么都不会发生。我收到的错误是索引错误,大概是猜测的长度。我的困惑来自这样一个事实:当我扫描刽子手的单词以匹配玩家的猜测时,我可以在下面直接完成相同的任务。请参阅下面的删节代码:

# Play begins and player guesses a letter
player_word = ['_ '] * len(cpu_word)
player_word2 = ['_'] * len(cpu_word)
alphabet = ['a','b',etc.]
print 'You have 10 guesses left'

# Determines if the guess is correct
for count in range(10)[::-1]:
    guess = raw_input(str('Guess a letter: '))
    # This is the previous method that creates a bug:/
    # alphabet.remove(guess)
    for e in xrange(len(alphabet)):
        if alphabet[e] == guess:
            alphabet.remove(guess)
    for i in xrange(len(cpu_word)):
        if cpu_word[i] == guess:
            player_word [i] = cpu_word [i]
            print 'Correct!'

我有两个问题。第一个是有人可以向我解释这个错误,特别是为什么它适用于扫描刽子手单词,但不适用于扫描列表。

其次,任何人都可以为这个问题提供解决方案。

我是编码的新手,所以非常感谢任何信息!

由于

3 个答案:

答案 0 :(得分:2)

无需循环使用字母表,您可以检查字母是否仍在字母表中:

if guess in alphabet:
    #And do the function here:
    alphabet.remove(guess)

你的for-loop包含一个缺陷。您正在删除字母表中的猜测字母,但随后您的for循环继续。这会导致错误,因为您的字母现在缩短了一个字母,而循环仍然认为它与之前的大小相同。因此,打破for循环:

for e in xrange(len(alphabet)):
    if alphabet[e] == guess:
        alphabet.remove(guess)
        break

答案 1 :(得分:1)

您的问题是使用索引遍历列表,同时更改列表的大小。您可以直接遍历项目:

for letter in alphabet:
    if letter == guess:
        alphabet.remove(guess)

或者,当你删除这封信时,你可以破解:

for e in range(len(alphabet)):
    if alphabet[e] == guess:
        alphabet.remove(guess)
        break

Break会停止循环终止,这很好,因为你在删除了这封信之后就已经完成了。

我认为set会比列表更好,因为它提供O(1)删除并包含。所以:

alphabet = ['a','b','c'...] # list, bad
alphabet = {'a','b','c'...} # set, good

然后你的字母“循环”将是:

if guess in alphabet:
    alphabet.remove(guess)

答案 2 :(得分:0)

您的问题是,从阵列中删除项目后,它现在只有一个项目,这意味着您无法转到数组的前一端。如果您的字母数组长26,并且删除了一个字母,则无法再访问第26个元素,因为该数组现在只有25个元素。在你猜对了之后,你就可以打破,就像这样:

for e in xrange(len(alphabet)):
    #print alphabet[e], e
    if alphabet[e] == guess:
        alphabet.remove(guess)
        break

但是你可以取消注释上面的行,并在删除之前检查它是否在数组中,如下所示:

for count in range(10)[::-1]:
guess = raw_input(str('Guess a letter: '))
if(guess in alphabet):
    """"This is the previous method that creates a bug:/"""
    alphabet.remove(guess)
    for i in xrange(len(cpu_word)):
        if cpu_word[i] == guess:
            player_word [i] = cpu_word [i]
            print 'Correct!'