编写面向对象的莫尔斯电码转换器

时间:2012-08-31 04:36:11

标签: python class reddit

下面是我对reddit.com/r/dailyprogrammer#93(简单)的解决方案。它是一个python脚本,可以在英语和摩尔斯语代码之间进行转换。

String_To_Translate是一个好类的例子吗?我违反了惯例吗?如何改进此代码并使其更具可读性和pythonic?

非常感谢任何建议!

import re

morse_code_dict = { 'a':'.-',
                    'b':'-...',
                    'c':'-.-.',
                    'd':'-...',
                    'e':'..-.',
                    'f':'..-.',
                    'g':'--.',
                    'h':'....',
                    'i':'..',
                    'j':'.---',
                    'k':'-.-',
                    'l':'.-..',
                    'm':'--',
                    'n':'-.',
                    'o':'---',
                    'p':'.--.',
                    'q':'--.-',
                    'r':'.-.',
                    's':'...',
                    't':'-',
                    'u':'..-',
                    'v':'...-',
                    'w':'.--',
                    'x':'-..-',
                    'y':'-.--',
                    'z':'--..',
                    '1':'.----',
                    '2':'..---',
                    '3':'...--',
                    '4':'....-',
                    '5':'.....',
                    '6':'-....',
                    '7':'--...',
                    '8':'---..',
                    '9':'----.',
                    '0':'-----',
                    ',':'--..--',
                    '.':'.-.-.-',
                    '?':'..--..',
                    '/':'-..-.',
                    '-':'-....-',
                    '(':'-.--.',
                    ')':'-.--.-',
                    ' ':' ',
                    }


class String_To_Translate:
    def __init__(self, string):
        self.string = string
        self.Translated = ''
        self.lang = ''

    def determine_lang(self):
        exp = r'[a-zA-Z\,\?\/\(\)]'#regexp for non morse code char
        if re.search(exp, self.string) == None:
            self.lang = 'm'
        else:
            self.lang = 'eng'

    def prep(self):
        if self.lang == 'eng':
            #get rid of whitespace & warn user
            (self.string, numWhitespaceReplacements) = re.subn(r'\s', ' ', self.string)
            if numWhitespaceReplacements > 0:
                print 'Some whitespace characters have been replaced with spaces.'
            #get rid of characters not in dict & warn user
            (self.string, numReplacements) = re.subn(r'[^a-zA-Z\,\?\/\(\)\.\-\s]', ' ', self.string)
            if numReplacements > 0:
                print 'Some ({0}) characters were unrecognized and could not be translated, they have been replaced by spaces.'.format(numReplacements)
            #convert to lowercase
            self.string = self.string.lower()

    def translate_from_morse(self):
        eng_dict = dict([(v, k) for (k, v) in morse_code_dict.iteritems()])

        def split_morse(string):
            d = '  '
            charList = [[char for char in word.split() + [' ']] for word in string.split(d) if word != '']
            charList = [item for sublist in charList for item in sublist]
            print charList
            return charList

        charList = split_morse(self.string)
        for char in charList:
            self.Translated += eng_dict[char]

    def translate_from_eng(self):
        charList=list(self.string)
        for char in charList:
            self.Translated += morse_code_dict[char] + ' '

    def translate(self):
        self.determine_lang()
        if self.lang == 'm':
            self.translate_from_morse()
        elif self.lang == 'eng':
            self.prep()
            self.translate_from_eng()
        else:
            print 'shit'

if __name__=="__main__":
    translateme = String_To_Translate(raw_input('enter a string: '))
    translateme.translate()
    print translateme.Translated
    print 'translating back'
    test = String_To_Translate(translateme.Translated)
    test.translate()
    print test.Translated

1 个答案:

答案 0 :(得分:0)

这很好地表达为binary tree

enter image description here