# Simple question about my ceasar cipher decoding loop

It is an exercise in one of the Python courses. I don’t understand why this doesn’t work.
Caesar ciphers work by giving you an enconded message and a key, which is the number of times you have to shift the letter to find the correct one. In this case the key is 10.
The error i get when running this is for alphabet[index]:
IndexError: string index out of range

``````alphabet = "abcdefghijklmnopqrstuvwxyz"
message = "xuo jxuhu! jxyi yi qd unqcfbu ev q squiqh syfxuh. muhu oek qrbu je tusetu yj? y xefu ie! iudt cu q cuiiqwu rqsa myjx jxu iqcu evviuj"

new_message = ""
for character in message:
if character in alphabet:
index = alphabet.find(character)
index = index + 10
if index > len(alphabet):
index = index - len(alphabet)
new_message = new_message + alphabet[index]
else:
new_message = new_message + character
print(new_message)

``````

I’m lazy, so I just popped in some debug code:

``````alphabet = "abcdefghijklmnopqrstuvwxyz"
message = "xuo jxuhu! jxyi yi qd unqcfbu ev q squiqh syfxuh. muhu oek qrbu je tusetu yj? y xefu ie! iudt cu q cuiiqwu rqsa myjx jxu iqcu evviuj"

new_message = ""
for character in message:
if character in alphabet:
print("character", character)
index = alphabet.find(character)
print("found", index)
index = index + 10
print("shift", index)
if index > len(alphabet):
index = index - len(alphabet)
print("shift 2", index)
new_message = new_message + alphabet[index]
else:
new_message = new_message + character
print(new_message)
``````

Final fail:

``````character i
found 8
shift 18
character q
found 16
shift 26
Traceback (most recent call last):
File "t.py", line 15, in <module>
new_message = new_message + alphabet[index]
IndexError: string index out of range
``````

Well, 26 is a wee bit over… try `if index >= len(alphabet):`

thanks! i also found i was supposed to use modulus 26, which works but i’m not sure how. my way was more… artisanal

Actually, I was going to mention the mod thing. To give an idea, this

``````print([x % 3 for x in (0,1,2,3,4,5,6)])
``````

Yields:

``````[0, 1, 2, 0, 1, 2, 0]
``````

Note the because find returns a `-1` index on fail, you needn’t bother with the `in` check.

I took a stab at this and came up with:

``````def ceasar(msg, shift = 3, domain = "abcdefghijklmnopqrstuvwxyz"):
def enc_char(c):
index = domain.find(c)
if index == -1:
return c
return domain[(index + shift) % len(domain)]
return "".join(enc_char(c) for c in msg)

message = "xuo jxuhu! jxyi yi qd unqcfbu ev q squiqh syfxuh. muhu oek qrbu je tusetu yj? y xefu ie! iudt cu q cuiiqwu rqsa myjx jxu iqcu evviuj"

print(ceasar(message, 10))

``````