so ill post a few of my failed examples below along with what I came up with as a fix, and then the actual correct code. I feel like im so close to grasping this, but missing some logic. this is for a hangman game.

one of the failed attempts:

import random
word_list = ["aardvark", "baboon", "camel"]
chosen_word = random.choice(word_list)

#Testing code
print(f'Pssst, the solution is {chosen_word}.')

#Create an empty List called display.
#For each letter in the chosen_word, add a "_" to 'display'.
#So if the chosen_word was "apple", display should be ["_", "_", "_", "_", "_"] with 5 "_" representing each letter to guess.


display = ["_"] * len(chosen_word)


guess = input("Guess a letter: ").lower()

#If the letter at that position matches 'guess' then reveal that letter in the display at that position.
#e.g. If the user guessed "p" and the chosen word was "apple", then display should be ["_", "p", "p", "_", "_"].

for letter in chosen_word:
if guess == letter:
for i in range(len(chosen_word)):
display.insert(i, guess)

print(display)

second:

for letter in chosen_word:
  if guess == letter:
    for i in range(len(chosen_word[letter])):
      display.insert(i, guess)

I ended up just saying screw it and went to this:

display = []
for char in chosen_word:
    if guess == letter:
        display += letter
   else:
    display += "_"

correct way of doing it:

import random
word_list = ["aardvark", "baboon", "camel"]
chosen_word = random.choice(word_list)

print(f'Pssst, the solution is {chosen_word}.')

display = []
word_length = len(chosen_word)
for _ in range(word_length):
  display += "_"
print(display)
  
guess = input("Guess a letter: ").lower()


for position in range(word_length):
  letter = chosen_word[position]
  if letter == guess:
    display[position] = letter

print(display)

so as you can see, i get that I can grab specific parts of a list using indices or slices, but somewhere in my brain my logic is wrong. if you guys have struggled with this before or if you have a good youtube video to help me break it down id be beyond thankful!

  • Herrmens@lemmy.world
    link
    fedilink
    arrow-up
    2
    ·
    edit-2
    10 months ago

    I think the other guys have already explained it quite well, but here are some more goodies that might interest you.

    Your first attempt of filling the display is the more pythonic way in my opinion and it works, so instead of initializing an empty array and the filling it, just use display = ["_"]*word_length

    Also for evaluating if the guess is in the word, there is a very nice iterator called enumerate, that hands you two values, the index and the actual value of the item, so you can use it like this:

    for position, letter in enumerate(chosen_word):
        if letter == guess:
            display[position] = letter
    

    Also, to play the full game you want to surround your guessing part with a while loop, so you can keep guessing until you have found the word. For this you will have to create a list of characters that resemble your chosen_word. There are several ways to do so and I will try to explain some of them.

    Here we are using the unpacking asterisk, that unpacks each character of your string into an item in the list

    while (display != [*chosen_word]):
        guess = input("Guess a letter: ").lower()
    
        for position, letter in enumerate(chosen_word):
            if letter == guess:
                display[position] = letter
        print(display)
    

    Another way would be explicitly casting the string into a list with the list function like this:

    while (display != list(chosen_word)):
    

    Last but not least we could use something like list comprehension, which is seen as very pythonic but a bit weird to look at when you are not used to it.

    while (display != [letter for letter in chosen_word]):
    

    What this essentially does is the same as creating a for loop and filling a list like this, but more comprehensive:

    chosen_word_list = []
    for letter in chosen_word:
        chosen_word_list.append(letter)
    

    W3Schools has some nice info about list comprehension. It is a rather advanced concept though so don’t let it bother you if you don’t get it right away.

    Happy coding :)

    • Osnapitsjoey@lemmy.oneOP
      link
      fedilink
      arrow-up
      1
      ·
      10 months ago

      Thank you very much! Yeah I’m just having problems with remembering where to put the x[y] in loops. I’ve done a few free classes and keep getting hung up on that part. It’s like my brain is having problems grasping it. I showed an example in another comment

      • Herrmens@lemmy.world
        link
        fedilink
        arrow-up
        1
        ·
        edit-2
        10 months ago

        Not sure how to help you with this, since that will change with what you want to archive in the loop. But maybe writing it in pseudo code might help:

        For each letter in the word

        for letter, position in enumerate(word):

        You want to check if your guess is the letter

        if letter == guess:

        If it is you want to add the letter to your display , exactly on the position it is in the original word

        display[position] = letter

        Does that kind of thinking help?