需要帮助制作莫尔斯电码到文本翻译器 | Python 命中:代码

问题描述

所以我在为文本翻译器制作莫尔斯电码时遇到了一些麻烦。然而,我将文本转换为莫尔斯,当我尝试将莫尔斯转换为文本时,它没有成功。我在网上查了一下,因为我是 Python 的新手,所以我无法真正理解其中的大部分内容,所以我决定自己制作一个。只要没有空格它就可以工作,但是当有空格时,我会收到此错误

Text to Morse or Morse to Text
Please type ttm for text to morse or type mtt for morse to text.
mtt
What would you like to have be translated to English?
.... ..  . ...- . .-. -.-- --- -. .
hiTraceback (most recent call last):
 File "main.py",line 61,in <module>
   print(mtt_dict[words],end="")
KeyError: ''

我翻译了“大家好”,但没有真正奏效

代码如下:

ttm_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':'-----',',':'--..--','.':'.-.-.-','?':'..--..','/':'-..-.','-':'-....-','(':'-.--.',')':'-.--.-'}

mtt_dict = {'-.--.-':')','.--.-':'(','-....-':'-','.-..-':'/','..--..':'?','-.-.-.':'.','--..--':','-----':'0','.----':'9','..---':'8','...--':'7','....-':'6','.....':'5','-....':'4','--...':'3','---..':'2','----.':'1','..--':'z','--.-':'y','-..-':'x','--.':'w','-...':'v','-..':'u','-':'t','...':'s','.-.':'r','-.--':'q','.--.':'p','---':'o','.-':'n','--':'m','..-.':'l','-.-':'k','---.':'j','..':'i','....':'h','.--':'g','.-..':'f','.':'e','..-':'d','.-.-':'c','...-':'b','-.':'a'
}
question = input("Text to Morse or Morse to Text\nPlease type ttm for text to morse or type mtt for morse to text.\n")

#Text to Morse
if question == "ttm":
  encrypt_q = input("What would you like have be translated to Morse Code\n")
  encrypt = encrypt_q.lower()
  morse = "" 
  for letter in encrypt: 
    encrypt.lower()
    if letter != ' ': 

            morse += ttm_dict[letter] + ' '
    else: 

            morse += ' '
  print(morse) 
  #Morse to Text
elif question == "mtt":
  decrypt = input("What would you like to have be translated to English?\n")
  lenword = len(decrypt)
  words = ''
  for i in decrypt:
    if i != ' ':
        words=words+i
        if i not in mtt_dict:
            print('Data not formatted properly')
            break
    else:
        print(mtt_dict[words],end="")
        words = ''

    #If they are cannot read
else:
  print("Invalid option")

任何帮助将不胜感激

解决方法

我认为不需要 2 个单独的 dict。你可以用一个字典来实现转换。 PFB 代码:

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':'-----',',':'--..--','.':'.-.-.-','?':'..--..','/':'-..-.','-':'-....-','(':'-.--.',')':'-.--.-'
}
question = input("Text to Morse or Morse to Text\nPlease type 'ttm' for text to morse or type 'mtt' for morse to text.\n")

#Text to Morse
if question == "ttm":
    encrypt_q = input("What would you like have be translated to Morse Code\n")
    message = encrypt_q.upper()
    cipher = ''
    for letter in message:
        if letter != ' ':
            # Looks up the dictionary and adds the correspponding morse code along with a space to separate morse codes for different characters
            cipher += MORSE_CODE_DICT[letter] + ' '
        else:
            # 1 space indicates different characters and 2 indicates different words
            cipher += ' '
    print(cipher)
#Morse to Text
elif question == "mtt":
    message = input("What would you like to have be translated to English?\n")
    # extra space added at the end to access the last morse code
    message += ' '
    decipher = ''
    citext = ''
    for letter in message:
        # checks for space
        if (letter != ' '):
            # counter to keep track of space
            i = 0
            # storing morse code of a single character
            citext += letter
            # in case of space
        else:
            # if i = 1 that indicates a new character
            i += 1
            # if i = 2 that indicates a new word
            if i == 2:
                # adding space to separate words
                decipher += ' '
            else:
                # accessing the keys using their values (reverse of encryption)
                decipher += list(MORSE_CODE_DICT.keys())[list(MORSE_CODE_DICT.values()).index(citext)]
                citext = ''
    print(decipher)
else:
    print("Invalid option")

输出:

莫尔斯转文字:

Text to Morse or Morse to Text
Please type 'ttm' for text to morse or type 'mtt' for morse to text.
mtt
What would you like to have be translated to English?
.... ..  . ...- . .-. -.-- --- -. .
HI EVERYONE

给莫尔斯发短信:

Text to Morse or Morse to Text
Please type 'ttm' for text to morse or type 'mtt' for morse to text.
ttm
What would you like have be translated to Morse Code
HI EVERYONE
.... ..  . ...- . .-. -.-- --- -. .
,

我认为是当你有两个空格时。如果这应该意味着单词之间的空格,那么只需在 mtt_dict 中添加一个包含空格字符值的空字符串键,它应该可以工作。

然后我认为您应该移动检查密钥是否在 mtt_dict 中的代码应该在打印字符之前移动到 else 部分

  for i in decrypt:
    if i != ' ':
        words += i
    else:
        if words not in mtt_dict:
            print('Data not formatted properly')
            break
        print(mtt_dict[words],end="")
        words = ''
,

你必须构建一个编码器/解码器,@Jolbas 告诉你,你的问题是用字符分隔明确单词。

如果合同分别是单字和双字 您可以通过这种方式使用 split:

<phrase>.split('  ') for word # 2 spaces
<word>.split(' ') for characters # 1 space

命中:

所以一切都可以使用嵌套列表理解来完成

[ [c for c in word] for word in phrase]

使用这个技巧可以解决大部分问题。

这是一个简洁的版本(不是所有的人都喜欢嵌套理解......反正还不错)

代码

ttm_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':'--..',')':'-.--.-'}

mtt_dict = {v:k for k,v in ttm_dict.items()}
question = input("Text to Morse or Morse to Text\nPlease type ttm for text to morse or type mtt for morse to text.\n")
if question == "ttm":
  encrypt_q = input("What would you like have be translated to Morse Code\n")
  # ' ' (single space,char separator
  # '  ' (double space) word separator
  morse = '  '.join([ ' '.join([ttm_dict[c] for c in word]) for word in encrypt_q.lower().split(' ')])
  print(morse)

elif question == "mtt":
  decrypt = input("What would you like to have be translated to English?\n")
  print(' '.join([''.join([mtt_dict[c] for c in word.split(' ')]) for word in decrypt.split('  ')]))

else:
  print("Invalid option")

结果如下

Please type ttm for text to morse or type mtt for morse to text.
ttm
What would you like have be translated to Morse Code
ciao da glauco
-.-. .. .- ---  -.. .-  --. .-.. .- ..- -.-. ---

Please type ttm for text to morse or type mtt for morse to text.
mtt
What would you like to have be translated to English?
-.-. .. .- ---  -.. .-  --. .-.. .- ..- -.-. ---
ciao da glauco