2015-08-19 291 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

謝謝!我知道有一個更簡單的方法來做到這一點,蟒蛇真是太神奇了! –