# Replacing letters of a string by implementing rotational cipher goes wrong

There is still some things to do to complete the script. But I’m going step by step and got stuck on my way.

``````# On the way to complete a function for the "Caesar cipher"

import string

def rotate(text: str, key: int):

# Creating a list of a-z (lc)
lc = list(string.ascii_lowercase)
print(lc)

# Creating a new list of a-z (new_lc) with shifted positions
# for the characters of "lc" according to the argument passed in parameter "key"
new_lc = []
for i in range(26):
i = i + key
if i > 25:
i = i - 26
new_lc.append(lc[i])
print(new_lc)

for char in text:
if char.isalpha() and char.islower():

# Replacing each character of "text" by shifting the letter for the value of the "key"
text = text.replace(char, new_lc[lc.index(char)])

return text

print(rotate("a e t", 7))
print(rotate("e t a", 7))
``````

The output is:

``````h l a
l h h
``````

I was expecting the second one to be `l a h` but for some reason (which I don’t understand) it doesn’t replace `t` with `a` in this case like it did in the first one. Looks like in this case, its replacing `t` with `a` and then that `a` with `h` (repeating the replacing for one letter) which is confusing.
I found the script is working fine with some random strings like “hi there”, “kill” but not working with some others like, “kill the cockroach”. I Can’t understand the problem.
Any help to make me understand and provide a standard solution is appreciated. Thanks for reading this far. `text` is mutating while the loop runs because of `text = text.replace(char, new_lc[lc.index(char)])`
Thus you are mapping characters more than once.

1 Like