为什么我的莫尔斯电码解码工具找不到任何后续字符



我正在开发莫尔斯电码编码/解码工具。我已经完成了编码器,我正在做解码器。目前的解码功能">MorseCodeDecoder(MSG(";一次可以解码一个字母。它通过逐个检查字符串中的每个字符并将它们复制到变量"中来实现这一点;EncodedLetter";。程序会检查每个字符,看看它是否是一个空格,如果是,程序会将其识别为字母之间的间隙,例如:MSG = ".... .." -*the function runs*- EncodedLetter = "....".然后通过字典(使用列表(对该值进行反向搜索,以找到EncodedLetter的关键字,在这种情况下,它是";H〃;,程序还检查表示两个单词之间的空格的双空格。在这个时候,它可能听起来功能齐全;然而,在找到一个编码的字母后,它找不到另一个,所以更早地"它找不到"即使我在变量成功解码一个字母后重置了它。

MorseCodeDictionary = {' ': ' ', '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': '-----'}
def MorseCodeEncoder(MSG):
EncodedMSG = f"""Encoded Message:
"""
MSG = MSG.upper()
for i in range(0, len(MSG), 1):
Encode = (MSG[i])
EncodedMSG = f"{EncodedMSG} {(MorseCodeDictionary.get(Encode))}"
return EncodedMSG
def MorseCodeDecoder(MSG):
DecodedMSG = f"""Decoded Message:
"""
MSG = MSG.upper()
DecodedWord = ''
DecodedLetter = ''
EncodedLetter = ''
for i in range(0, len(MSG)):
DecodedLetter = ''
Decode = (MSG[i])
try:    
if (MSG[i + 1]) == ' ':
EncodedLetter = f"{EncodedLetter + (MSG[i])}"
DecodedLetter = list(MorseCodeDictionary.keys())[list(MorseCodeDictionary.values()).index(EncodedLetter)]
DecodedWord = DecodedWord + DecodedLetter
EncodedLetter = ''
DecodedMSG = f"{DecodedMSG} {DecodedWord}"
elif (MSG[i + 1]) + (MSG[i + 2]) == '  ':
DecodedWord = ''
else:
EncodedLetter = f"{EncodedLetter + (MSG[i])}"

except (ValueError,IndexError):
pass

return DecodedMSG

Loop = 1
while Loop == 1:
Choice = str(input("""[1] Encode, or [2] decode?
"""))
if Choice == '1':
MSG = str(input("""Type the message you would like to encode. Do not use puncuation.
"""))
EncodedMSG = (MorseCodeEncoder(MSG))
print (EncodedMSG)
elif Choice == '2':
MSG = str(input("""Type what you wish to decode.
"""))
DecodedMSG = (MorseCodeDecoder(MSG))
print (DecodedMSG)
else:
print ('1, or 2')

您只需使用str.join()str.split(),就可以轻松地将字符串附加到字符串中,并从编码字符串中挑选出每个字符来形成莫尔斯电码字母!此外,我建议用一个不能作为正确编码字符串一部分的字符来分隔编码的莫尔斯电码字母,例如/。通过这种方式,您可以确保字符串中的所有空格都是空格,并且字符串中的全部斜杠都是字母分隔符。首先,让我们定义编码和解码的字典

en_to_morse = {' ': ' ', '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': '-----'}
morse_to_en = {v: k for k, v in en_to_morse.items()} # Reverse lookup for encoder

morse_to_en字典可以简单地通过反转en_to_morse字典中的键和值来创建。这两个可以组合在一起,因为它们没有任何共同的键(除了空格,这并不重要,因为它保持不变(,但在这个例子中,我将把它们分开。

然后,你可以这样写编码器函数:

def MorseEncode(msg):
morse_msg = [] # make an empty list to contain all our morse symbols
for char in msg.upper(): # Convert msg to uppercase. Then iterate over each character
morse_char = en_to_morse[char] # Get the translation from the dictionary
morse_msg.append(morse_char)   # Append the translation to the list
return '/'.join(morse_msg)   # Join symbols with a '/'

解码器的功能与编码器的功能正好相反。

def MorseDecode(msg):
morse_chars = msg.split("/") # Split at '/'
en_msg = ""                  # Empty message string 
for char in morse_chars:     # Iterate over each symbol in the split list
en_char = morse_to_en[char]  # Translate to English
en_msg += en_char            # Append character to decoded message
return en_msg  

要运行此:

encoded = MorseEncode("Hello World") # gives '...././.-../.-../---/ /.--/---/.-./.-../-..'
decoded = MorseDecode(encoded) # gives 'HELLO WORLD'

您会丢失大小写信息,因为莫尔斯电码不区分大小写字符。


您也可以将函数写成一行代码:

def MorseEncode(msg):
return '/'.join(en_to_morse[char] for char in msg.upper())
def MorseDecode(msg):
return ''.join(morse_to_en[char] for char in msg.split('/'))

最新更新