2015-08-19 12 views
6

chcę konwertować kod Morse'a do języka angielskiego przy użyciu Python 3+ udało mi się po angielsku, aby przekształcić kod Morse'a za pomocą tego http://code.activestate.com/recipes/578407-simple-morse-code-translator-in-python/Morse kod na angielski python3

ale chcę konwertować kod Morse'a do języka angielskiego

Próbowałem zrobić to po jednym charecterze naraz, ale problem polega na tym, że litery alfabetu Morse'a nie są 1 charecter długie jak angielskie litery, więc E to "." a S jest "...", problem polega na tym, że pętla słownikowa znajdzie "." i dopasuj go do E, więc zamiast otrzymywać S, otrzymuję "EEE" próbowałem to naprawić, wykrywając spacje i robiąc to słowo na raz, ale zamiast szukać liter w słowie, przeszukuje całe słowo przeciw słownik Jestem nowy w Pythonie i słownikach i nie wiem jak odróżnić E "." oraz S „...”, szukając mojego słownika

Oto mój kod

# 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() 

Ten kod zajmuje słowo i próbuje szukać go przed słownika, ale to nie działa Próbowałem również przeszukiwać każdą pojedynczą literę alfabetu Morse'a przed słownikiem, ale problem polega na tym, że nie można stwierdzić, kiedy litera zaczyna się i kończy, więc "..." wychodzi jako "EEE" zamiast "S", a ja nie wiesz, jak rozwiązać ten

Próbowałem również poszukiwanie rozwiązań, ale znalazłem je tylko w Javie i nie wiem Java

+1

Musisz zeskanować wejście, aż osiągniesz pauzę wskazującą następny znak. Na przykład, jeśli masz wejście "" ... "" jest spacja między kropkami i masz trzy "", ale jeśli wejście to "" ... "" nie masz miejsca, więc masz je " "..." '. Możesz to zrobić za pomocą metody "split" na wejściu. – skyking

+0

Jest to problem matematyczny, że kod (Morse) nie jest funkcją iniekcyjną. Musisz znać spacje (przerwy) między elementami kodu. https://en.wikipedia.org/wiki/Injective_function – cansik

Odpowiedz

14

Po zdefiniowaniu mapowanie w jednym kierunku, można użyć zrozumieniem dict do mapę w drugą stronę

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()} 

Następnie można użyć join z wyrażeniem generatora do wykonywania tłumaczeń.

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

świetny przykład python power – svfat

+1

dziękuję! Wiedziałem, że jest łatwiejszy sposób to zrobić, python naprawdę jest niesamowity! –