翻译:使用字典进行翻译

6

我只是在尝试一些工作簿中的代码,有不同的练习题,但我想尝试一个带有预先存在消息的练习题,我已经做到了这一步,但是我无法弄清如何完成它。我该怎么做?

alphabet = {"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": "--.."}

message = ".-- .... . .-. . / .- .-. . / -.-- --- ..-"

for key,val in alphabet.items():
    if message in alphabet:
        print(key)

6
如果你想解码莫尔斯电码信息,那么你不应该反转字典吗? - Willem Van Onsem
1
此外,您首先需要将消息分成单独的部分。 - Willem Van Onsem
有些字母包含其他字母。 - whackamadoodle3000
我曾经看到过这样做,只需保留消息即可。不过,如果这种方式更好,我可以进行更改。 - Peter Toole
2个回答

7

这里的根本问题在于你需要将消息分成可以单独解码的部分。

消息首先通过斜杠(单词)分隔,然后通过空格(字符)分隔。因此我们可以使用两次split()来获取元素:

for word in message<b>.split('/')</b>:
    for character in word<b>.strip().split()</b>:
        # ... decode the character

现在我们需要某种方式来解码字符。但是,存储以字符为键的字典并没有太多意义:我们想要解码消息,因此这里点和破折号需要成为键,而不是字母字符。
我们可以自己构建一个新的字典,或者自动构建一个新的字典:
decode_dict = {v: k for k, v in alphabet.items()}

那么我们可以使用查找方法:

decode_dict = {v: k for k, v in alphabet.items()}

for word in message<b>.split('/')</b>:
    for character in word<b>.strip().split()</b>:
        print(decode_dict[character])  # print the decoded character
    print(' ')  # print space after the word

现在我们已经得到了解码后的消息,但每个字符都在单独的一行上。不过,我们可以使用str.join和生成器先生成一个字符串:
' '.join(''.join(decode_dict[character] for character in word.strip().split())
         for word in message.split('/'))

结果就是解码后的字符串:
>>> ' '.join(''.join(decode_dict[character] for character in word.strip().split())
...          for word in message.split('/'))
'WHERE ARE YOU'

我不知道为什么,但是当我这样做时,它会多次打印“你在哪里”,我做错了吗?你能否编辑该响应并提供最终代码? - Peter Toole
我设法弄对了,但解码后的消息每个字符都输出在新行上。 - Peter Toole
@PeterToole,要使其不将每个字符输出到新行,请使用print(message, end='') - Tom Burrows
@PeterToole:但这已经在答案中了。你不应该总是打印每个解码字符,最好将内容连接在一起。 - Willem Van Onsem

5
你需要反转你的字典:
alphabet1 = {b:a for a, b in alphabet.items()} 
message = ".-- .... . .-. . / .- .-. . / -.-- --- ..-"
decoded_message = ''.join(alphabet1.get(i, ' ') for i in message.split())

输出:

'WHERE ARE YOU'

1
你漏掉了 message.split() - Yotam Ofek
1
@Ajax1234 我已经尝试过了,但它不喜欢“/”,会报错。 - Peter Toole
@PeterToole,“/”代表什么?是句子的结尾吗? - Ajax1234
@Ajax1234 对的,这是一个空格,所以它在分隔单词。 - Peter Toole
谢谢@Ajax1234,我不得不在那里加入一个print(decoded_message)才能使它工作,我不知道是否有意,但还是谢谢! :) - Peter Toole
@PeterToole 很高兴能帮到你!如果这个答案对你有帮助,请接受它。 - Ajax1234

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接