使用循环和字典解码莫尔斯电码程序

问题描述

我正在为莫尔斯电码编写编码和解码函数。编码功能正在工作,但解码功能多次提供相同的输出。有人可以看看我如何将 for 循环修复为仅打印一次。顺便说一句,它是向后打印的,因为我是这样打印的

解码函数的示例输入

....  .  .-..  .-..  --- 

预期输出

HELLO

输出

OLLEHOLLEHOLLEHOLLEHOLLEHOLLEHOLLEHOLLEHOLLEHOLLEHOLLEHOLLEHOLLEHOLLEHOLLEHOLLEHOLLEHOLLEHOLLEHOLLEHOLLEHOLLEHOLLEHOLLEHOLLEHOLLEHOLLEH

我的代码

MORSE_CODES={'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':'--..'}


def decode_Morse(my_msg): 
 
  string=" "
  
  for morsecode in my_msg:
    wordsplit=my_msg.split()

    for ch in wordsplit:
      if ch!="  ":
        string=string+ list(MORSE_CODES.keys())[list(MORSE_CODES.values()).index(ch)] 
      else:
        ch=" "
      
  return string

def main()
     my_msg_reverse_Morse_plain=decode_Morse(my_msg_reverse_Morse)
     print("Plaintext of the prevIoUs Morse Code:",

解决方法

简单的这个怎么样?

MORSE_DECODES = {v:k for k,v in MORSE_CODES.items()}
def decode_Morse(my_msg):
    return "".join(MORSE_DECODES[ch] for ch in my_msg.split())

你自己的代码使用了太多的循环,试试这个:

def decode_Morse(my_msg): 
 
  string=""
  
  for morsecode in my_msg.split():
      string=string+list(MORSE_CODES.keys())[list(MORSE_CODES.values()).index(morsecode)]
      
  return string

如果您有多个单词,那么您必须对单独的字母和单词使用不同的分隔符。例如,字母的空格,单词的 3 个,那么这将起作用:

def decode_Morse(my_msg): 
  string = ""
  for word in my_msg.split("   "):
      for ch in word.split():
          string=string+list(MORSE_CODES.keys())[list(MORSE_CODES.values()).index(ch)]
      string = string + " "
  return string
,

我认为最好定义一个反向字典,将莫尔斯电码映射到字符,然后将它们映射到代码:

# Reversed dictionary: 
my_msg = '....  .  .-..  .-..  --- '
rkey = {v:k for k,v in MORSE_CODES.items()}
answer = "".join(map(lambda x: rkey[x],my_msg.split()))
print(answer)
# HELLO