Search code examples
pythonsetkeyerror

I don't understand this KeyError?


I'm doing this challenge where i am tasked at coding up a game of hangman - where I am supposed to reduce the range of words in a set.The rules of the game states that you get 8 tries too guess otherwise you'd lose.If the user were to key in the same letter more than once a message would pop up stating that he's already done so - I've used sets as a way to handle this part of the game. Below is my code:


word_list = ["python", "java", "kotlin", "javascript"]
word = random.choice(word_list)
word_set = set(word)

hidden = []
for i in word:
    hidden.append("-")
# print(hidden)


print("H A N G M A N")

count = 0
while(count < 8):
    print()
    print("".join(hidden))
    guess = input("Input a letter: ")
    if guess in word:
        if guess not in word_set:
            print("No improvements")
            count += 1
        else:
            for i in range(len(word)):
                if word[i] == guess:
                    print(word_set)
                    word_set.remove(word[i])
                    hidden[i] = word[i]
                    if word_set == set():
                        print()
                        print(word)
                        print("You guessed the word!")
                        print("You survived!")
    else:
        print("No such letter in the word")
        count += 1

print("You are hanged!")

The main problem I face is an error telling me that 'a' and only 'a' in particular is a key error which goes like this: Traceback (most recent call last): File "/Users/laipinhoong/Desktop/learnpython.py/learning.py", line 29, in <module> word_set.remove(word[i]) KeyError: 'a'


Solution

  • The problem appears when the chosen word has the same letter more once. In that case, since you iterate over all the letters in word (for i in range(len(word))) you will try to remove this word few times from the set word_set (as much as this letter appears in the word) but word_set will have this letter only once since set is unique collection. So in the second attempt to delete a from javascript or java, word_set.remove(word[i]) will fail cause the set will not contain this letter anymore.

    In order to prevent the error, try to use: word_set.discard(word[i]) instead. In that case, the letter will be removed if exists and if not, no exception will be raised.