Using Python's String Slicing to Add/Replace Characters in Specific Positions
Tags: python, beginners, tutorial
Published: 2022-04-11 11:25:19

**Intro**

This article demonstrates how to replace characters in one string for the characters in another using the classic game of hangman. This may seem like it should be fairly straightforward but it is actually somewhat tricky. I will show the game code, the main problem I encountered, and a solution to that problem. 

**The Game** 

```python
word = "hello"
perm_word = "hello"
blank = "-" * len(word)
count = len(word) * 2

print(f"This is a hangman game. Can you guess the word: {blank} in 10 tries?")

while blank != perm_word and count != 0:
    guess = input("Guess a letter: ")
    if len(guess) > 1:
        print("Type a single letter.")
        continue 
    for char in guess:
        if char in word:
            i = word.find(char) 
            blank = blank[:i] + char + blank[i+1:]
            word = word[:i] + "-" + word[i+1:]
            count -= 1
            print(blank)
            print(f"Correct! You have {count} tries left.")
        else:
            count -= 1
            print(f"Wrong. You have {count} tries left.")

if count != 0:
    print("You win!")
else:
    print("You lose.")
```

**THE PROBLEM**

All of the code executed properly except for the lines that replace the dashes in `blank` with the properly guessed characters from `word`. 

When played, the game printed a correct guess as a single character like this: `e`. If the second guess was an `h` the game would print `eh` instead of `he`.

**THE SOLUTION**

The key thing to remember for this problem is that strings in Python are immutable. To replace or add characters to a string, Python needs to create a copy of the string and replace characters in that copy.

The following three lines of code provide this function. 

```python
i = word.find(char) 
blank = blank[:i] + char + blank[i+1:]
word = word[:i] + "-" + word[i+1:]
```

The first line gets the index value for the guessed character.

Using this value, the second line slices the dashes in `blank` by selecting all the index values before the guessed character with `blank[:i]`. It then concatenates this first slice with the guessed character and the ending slice. `blank[i+1:]` is the final slice. It selects all of the remaining index values after the guessed character. 

Now if you guess `e` the game prints: `-e---`.

Problem solved? Not quite. 

The word "hello" has two "l's". Everything works as expected for the first "l". The game prints: `-el--`. However, when a second "l" is guessed, the game stops at the first "l" and continues to print: `-el--`. 

The third line of the code above solves this. It functions similarly to the previous line except it operates on `word` instead of `blank`. Essentially this makes the two variables exchange their values as characters are guessed. 

If `l` is guessed the values of `blank` and `word` will look like this: 

`blank = "--l--"`
`word = "he-lo"`

Now when the second `l` is guessed, `word` only contains one `l`. The game functions as it should. The values of `blank` and `word` will look like this:

`blank = "--ll-"`
`word = "he--o"`

**ADDING A CHARACTER**

To add a character in a specific position instead of replacing it, remove the `+1` from `i` in the final slice. For example, if `e` is guessed the following line of code:
 
```python
word = word[:i] + "-" + word[i:]
```
will print:

`"h-ello"`

Thanks for reading!