2015-08-19 292 views
6

我想用Python 3+莫尔斯代码转换为英文 我已成功地将英文使用此 http://code.activestate.com/recipes/578407-simple-morse-code-translator-in-python/莫尔斯电码,以英文python3

到莫尔斯电码,但我想莫尔斯代码转换为英文

我一直试图做一个文字,但问题是莫尔斯的代码字母不是像英文字母那么长,所以E是“。”。 S是“...”,我遇到的问题是字典循环会找到“。”。并与E匹配,所以我没有得到S我得到“EEE” 我试图通过检测空格并一次处理一个单词来解决此问题,但不是在单词中查找字母,而是搜索整个单词字典 我是新来的Python和字典,我不知道如何区分E“。”和S“...”搜索时,我的字典

这里是我的代码

# defines the dictionary to convert morse to english 
CODE_reversed = {'..-.': 'F', '-..-': 'X', 
       '.--.': 'P', '-': 'T', '..---': '2', 
       '....-': '4', '-----': '0', '--...': '7', 
       '...-': 'V', '-.-.': 'C', '.': 'E', '.---': 'J', 
       '---': 'O', '-.-': 'K', '----.': '9', '..': 'I', 
       '.-..': 'L', '.....': '5', '...--': '3', '-.--': 'Y', 
       '-....': '6', '.--': 'W', '....': 'H', '-.': 'N', '.-.': 'R', 
       '-...': 'B', '---..': '8', '--..': 'Z', '-..': 'D', '--.-': 'Q', 
       '--.': 'G', '--': 'M', '..-': 'U', '.-': 'A', '...': 'S', '.----': '1'} 


    def main(): 
     #takes user message and makes it upper case 
     msg = input('MESSAGE: ') 
     msg = msg.upper() 

    addtolist = "" # creates blank string 
    message = [] # creates blank list 
    for i in msg: 
     addtolist = addtolist + i # adds every letter in MSG into a string until it finds a space 
     addtolist.upper() # makes every letter uppercase 

     if i == " ": # if it detects a space 
      message.extend(addtolist) 
      # adds the previously created addtolist to a list, this makes one word 
      addtolist = "" # clears previous variable 

    for i in message: 
     # for every word in the list 
     str(i) # make it into a string 
    print(CODE_reversed[i()]) # search the dictionary for that word 


if __name__ == "__main__": 
    main() 

该代码接受一个单词,并尝试看看它反对字典,但它不工作 我也尝试在字典中搜索每个单独的莫尔斯电码字母,但问题在于,你无法分辨信件何时开始和结束,所以“...”以“EEE”而不是“S”出现,我不知道不知道如何解决这个问题

我也试过寻找解决方案,但只发现它们在Java中,我不知道Java

+1

您必须扫描输入,直到您到达指示下一个字符的暂停。例如,如果你输入了'“......”',那么点之间就有空格,而你有三个'''''s, “......”'。你可以通过在输入上使用split方法来做到这一点。 – skyking

+0

这是一个数学问题,代码(莫尔斯)不是一个内射函数。你必须知道代码元素之间的空格(中断)。 https://en.wikipedia.org/wiki/Injective_function – cansik

回答

14

一旦在一个方向上定义的映射,则可以使用一个字典理解到的其他方式

CODE = {'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': '--..', 

     '0': '-----', '1': '.----', '2': '..---', 
     '3': '...--', '4': '....-', '5': '.....', 
     '6': '-....', '7': '--...', '8': '---..', 
     '9': '----.' 
     } 

CODE_REVERSED = {value:key for key,value in CODE.items()} 

映射它然后可以使用join与发电机表达式来执行转换。

def to_morse(s): 
    return ' '.join(CODE.get(i.upper()) for i in s) 

def from_morse(s): 
    return ''.join(CODE_REVERSED.get(i) for i in s.split()) 

>>> to_morse('hello') 
'.... . .-.. .-.. ---' 
>>> from_morse('.... . .-.. .-.. ---') 
'HELLO' 
+3

python power的好例子 – svfat

+1

谢谢!我知道有一个更简单的方法来做到这一点,蟒蛇真是太神奇了! –