Skip to main content
 首页 » 编程设计

python之编写面向对象的摩尔斯电码翻译器

2025年05月04日9birdshome

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

String_To_Translate 是一个很好的类示例吗?我违反约定了吗?我怎样才能改进这段代码并使其更具可读性和 Python 风格?

非常感谢任何建议!

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 

请您参考如下方法:

这很好地表达为 binary tree :