Ваш код работает правильно.
Ибо в последовательности
str=str.replace('a', 'c')
str=str.replace('c', 'e')
str=str.replace('e', 'g')
str=str.replace('g', 'i')
str=str.replace('i', 'k')
.......
str=str.replace('z', 'b')
Любая не а станет b
В данном случае будет логичнее представить str как итерируемый объект. Т.е. в цикле обойти каждую букву отдельно. И отдельно применить правило замены. Ну а как убрать кучу replace вам лучше додуматься самому, все достаточно просто