【问题标题】:Using dictionary and printing out value when matched key and vise-versa匹配键时使用字典并打印出值,反之亦然
【发布时间】:2018-10-16 01:04:20
【问题描述】:

我有一本字典,其中key 是字母表中的一个字母,而value 是其对应的摩尔斯电码字母(例如”A”: “.-“)。我还有一个用户输入,用户在其中放置消息。一旦他们按下回车,它就会检查每个输入的字母,看看它是摩尔斯电码还是英文字母,看看它是否在值或键中。之后,我希望它打印相应的字母(例如,如果它发现“.-”,将打印“A”)。我该怎么做?

到目前为止,这是我的代码:

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

user_input = input("Input english or morse code message:\n").upper()

for i in user_input:
    if i in translation.keys(): 
        print(translation.values()) 
    if i in translation.values():
        print(translation.keys())

【问题讨论】:

  • 我尝试将图像中的代码复制粘贴到我的终端中,但没有成功。
  • 用户输入是否只包含值或键和值两者?
  • 它可能不会完全按照你的意愿工作。给出翻译方向会更容易,尤其是对于空格。
  • 从摩尔斯语翻译回字母的简单方法是制作另一本字典,以摩尔斯电码作为键,字母作为值。你知道如何从你的translation dict 构建这样的 dict 吗?
  • 莫尔斯语中不同的字母是如何分开的? .... 可能是 H 或两个 I - 除非您有分隔空间,否则您无法 100% 知道是否是其中一个

标签: python dictionary


【解决方案1】:

要将文本翻译成莫尔斯语,只需将字符串中的字符map 转换为translation 字典中的相应值即可:

>>> msg = "HELLO WORLD"
>>> morse = ' '.join(map(translation.get, msg))
>>> morse
'.... . .-.. .-.. ---    .-- --- .-. .-.. -..'

请注意,我用空格分隔代码,否则几乎不可能将消息解码回来,因为某些序列可能会产生不同的字符组合。对于翻译回来,你首先要逆字典;然后split按空格的莫尔斯电文,从逆字典中取值。

>>> trans_back = {v: k for k, v in translation.items()}
>>> ''.join(map(trans_back.get, morse.split()))
'HELLOWORLD'

请注意,这会删除空格。要解决此问题,您可以使用与空格不同的符号来分隔莫尔斯电码序列。 或者使用这个稍微复杂一点的版本,使用re.split 在一个空格处拆分,前提是该空格后面没有,或者前面没有另一个空格:

>>> ''.join(map(trans_back.get, re.split("(?<! ) | (?! )", morse)))
'HELLO WORLD'

要决定翻译的方式,即原始文本是莫尔斯文​​本还是纯文本,您可以检查字符串的第一个或所有字符是否在translation字典中,或者它们是否是有效的莫尔斯符号:

if all(c in translation for c in msg):
    # translate to morse
elif all(c in ".- " for c in msg):
    # translate back
else:
    # don't know what to do

注意:此答案是在将尾随空格添加到字典中的所有条目之前发布的。

【讨论】:

  • 另外,我不希望将莫尔斯电码转换为常规文本的能力依赖于莫尔斯变量。我该如何更改代码?
  • @StrangeRanger 你是什么意思? morse 只是保存先前翻译文本的变量。在你的情况下,那可能只是user_input。我认为这将是不言自明的......
  • 我不知道我是否需要做一些不同的事情才能让它工作。这是我得到的错误:“''.join(map(trans_back.get, user_input.split()));类型错误:序列项 0:预期的 str 实例,找到无类型”
  • @StrangeRanger 看起来您输入的不是有效的莫尔斯电码,或者缺少分隔符。要检查,请将''.join 替换为list 以将其转换为列表。 None 的位置是找不到翻译的位置。如果您希望它与那些一起工作,您可以尝试“''.join((trans_back.get(x, "?") for x in user_input.split())) 为每个未知字符插入一个?
  • @StrangeRanger 您只需要rstrip,因为您在每个莫尔斯电码的末尾添加了空格。您可以使用' '.join 而不是''.join 来获得相同的效果,就像我在我的回答中所展示的那样。下次您以这种方式更改问题时,您应该发表评论,因为这将使迄今为止给出的所有答案无效。
【解决方案2】:

您将不得不检查它是莫尔斯电文还是“阿尔法”电文:

 # build a reversed dict
translation_from_morse = {v: k for k, v in translation.items()}

user_input = input("Input english or morse code message:\n").upper()

if user_input[0] in ".-":
    print(" ".join("".join(translation_from[morse] for morse in part.split(" ")) for part in user_input .split("  ")))
else:
    print(" ".join(translation_to.get(c, c) for c in user_input ))

【讨论】:

  • translation_to 未定义
  • @StrangeRanger 已修复
【解决方案3】:

在这种情况下,将字母转换为摩尔斯电码非常简单。您只需使用键访问值并将每个字符串值连接到另一个字符串。见下文:

user_input = input("Input english to translate to morse code: ")

morse_code_message = ""
for i in user_input:
    if i in translation.keys():
         morse_code_message += translation[i]
print(morse_code_message)

但是,字典不能反过来使用。所以莫尔斯到英语会有所不同。您将不得不搜索字典值。如果您绝对必须这样做,请参阅this post。解决此问题的一种便宜且简单的方法是只制作两个翻译表,并使用与英语到莫尔斯语相同的逻辑。

【讨论】:

    【解决方案4】:

    建立原始字典的反向索引,然后你有两个方便的查找。现在您遇到的问题是 morse 的长度与字符的长度不同。假设 morse 字符间间隙写为空格,您可以通过首先检查其 alpha(pop 1 char)还是 morse(pop 多个 chars)来一次使用输入流一个标记。

    注意,i in translation 不是translation.keys()

    translation = {... your original dict ...}
    morse_to_alpha = {v,k for k,v in translation.items()}
    
    user_input = input("Input english or morse code message:\n").upper()
    
    while user_input:
        if user_input[0] in translation:
            print(translation.pop(0))
        elif user_input[0] in '.-':
            try:
                 separator = user_input.index(' ')
            except ValueError:
                 separator = len(user_input)
            morse = user_input[:separator]
            del user_input[:separator+1]
            print(morse_to_alpha[morse])
        else:
            print("unkown symbol") 
    

    【讨论】:

    • 这不起作用。莫尔斯电码有不同的长度
    • 莫尔斯是几个字符= 1 aplha - 你迭代莫尔斯字符 - 不会工作。您将不得不继续添加临时文件,直到找到一个匹配的莫尔斯,然后您仍然在 ....HII 和其他人之间有歧义,给您一个还不是“真实”的匹配一个,因为那个会更长。
    猜你喜欢
    • 1970-01-01
    • 2019-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多