[Tutor] implementing rot 13 problems

Alan Gauld alan.gauld at btinternet.com
Tue Mar 12 10:54:18 CET 2013


On 12/03/13 05:57, RJ Ewing wrote:
> I am trying to implement rot 13 and am having troubles. My code is as
> follows:

There are better ways to do what you are doing but assuming this is a 
learning exercise rather than a serious project I'll make some comments:

> def rot_text(self, s):
>    ls = [i for i in s]
>    for i in ls:

You could have looped directly over s and built a new list to return.
Just a thought.

>        if i.isalpha():
>           if i.isupper():

Since the code in the upper and lower sections are nearly identical you 
can avoid the repetition by assigning the test char (M or m) here and 
then using a single block to do the conversion.

                 test = 'M'
             else:  # must be lower
                 test = 'm'

Or more concisely

            test = 'M' if i.isupper() else 'm'


	if i <= test:
           x = ls.index(i)
           ls[x] = chr(ord(i) + 13)
         elif i > test:
           x = ls.index(i)
           ls[x] = chr(ord(i) - 13)

The elif could just as well be an else...

You never used x originally, but then here you do....
but it would have been easier to get it at the start
of the loop with:

for index, char in enumerate(ls):

And that would be more readable names too...

However, given the relatively small character set and fixed target a 
simple mapping table would be easier to implement as suggested by 
another poster.

> Now if I enter abc, I get nop. But if I enter abcdefghijklmnop, I
> get abcqrstuvwxyznop.

No idea what is going on there. But you are returning ls - the list. I 
would have thought you'd want to return the string version of the list?

return ''.join(ls)

maybe?


-- 
Alan G
Author of the Learn to Program web site
http://www.alan-g.me.uk/



More information about the Tutor mailing list