Convert letters into numbers (A=1, B=2 etc) class Names:
    def __init__(self,name):
        self.name = name
        self.numname = name
        for letter in name:
            self.numname = re.sub(letter, rosetta[letter] + ",", self.numname)
        self.numname = self.numname.split(',')[:-1]


Essentially what this does is creates an attribute for the object called 'numname' which is his/her name converted into numbers (A = 1, B = 2 This is stored in a dictionary called 'rosetta')  and stores each number as an element in a list. It works but it feels really inefficient. The problems I see here are:


self.numname is called quite a lot. (Maybe it's possible to use list comprehension here?)
re.sub is called per letter. I'd imagine this is unavoidable, however if a name had repeated letters (e.g. Matt). I tried using ''.join(OrderedDict.fromkeys(self.numname) in the third field of re.sub but then that screws up the number separation.


How can I make the creation of this list more concise/more permanent?
You might try something like:

self.numname = [rosetta[x] for x in self.name]


This creates the list of numbers directly from the letters in the name, using a list comprehension.