William01 发表于 2024-7-29 16:14:05

B站37讲摩斯密码报错

在B站学习第37讲,请问为什么会报错?谢谢!

代码如下
# 摩斯密码对照表
c_table = [".-", "-...", "-.-", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-", "..-", "...-", ".--", "-..-", "-.--", "--..", ".----", "..---", "...--", "...-", ".....", "-....", "--...", "---..", "----.", "-----"]

# 摩斯明文表
d_table = ["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"]
code = input("请输入摩斯密码: ")
请输入摩斯密码:
split_code = code.split(" ")
result = for each in split_code]
Traceback (most recent call last):
File "<pyshell#7>", line 1, in <module>
    result = for each in split_code]
ValueError: '' is not in list

FishC 发表于 2024-7-29 16:14:18

哈哈,看来你在摩斯密码的海洋里遇到了一点小浪涡!让我们来看看你的代码,帮你划回安全水域。

从错误信息来看,问题出在这行代码上:

result =

这里有几个潜在问题:

1. **摩斯明文表 (d_table)** 没有定义:你在代码中提到了 `d_table`,但并没有给出它的实际内容。确保它包含摩斯代码与字母之间的对应关系。例如,它可能是一个字典(dictionary),像这样:

   d_table = {'.-': 'A', '-...': 'B', '-.-.': 'C', ... }# 继续添加其他字符

2. **迭代分割的摩斯密码**:在你的代码里,你试图用 `d_table` 直接替换分割后得到的摩斯密码。这其实应该是查找而不是替换。可以改成用 `d_table.get()` 来获取每一段摩斯密码对应的字符。例如:

   result =

   这里 `d_table.get(each, '')` 是在查找当前摩斯代码对应的字符,如果没找到,就返回空字符串,这样就不会报错了。

最终完整的代码示例可能如下所示:

# 摩斯密码对照表
d_table = {
    '.-': 'A',
    '-...': 'B',
    '-.-.': 'C',
    # 继续添加其他摩斯码和字母
}

code = input("请输入摩斯密码: ")
split_code = code.split(" ")
result =
decoded_message = ''.join(result)
print("解码结果:", decoded_message)

这样调整后再试试看,应该能顺利输出解码结果!搞定摩斯密码,成为编程的小超人!如果有其他问题,随时问我哦!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

William01 发表于 2024-7-29 16:19:19

FishC 发表于 2024-7-29 16:14
哈哈,看来你在摩斯密码的海洋里遇到了一点小浪涡!让我们来看看你的代码,帮你划回安全水域。

从错误信 ...

谢谢小助理的回复。我还有一个问题:为什么我输入“code = input("请输入摩斯密码: ")”后,按enter键进行换行时会生成“请输入摩斯密码:”,而你的却没有?

FishC 发表于 2024-7-29 16:19:29

William01 发表于 2024-07-29 16:19
谢谢小助理的回复。我还有一个问题:为什么我输入“co ...

哈哈,好问题!其实这个现象是由于输入的方式不同导致的。

在你的代码中,当你运行 `code = input("请输入摩斯密码: ")` 时,程序会在控制台输出“请输入摩斯密码:”这句话,然后等着你输入。按下 Enter 键后,它才会开始处理你输入的内容。

而在我的回答中,我只是给你提供了一个代码示例,并没有实际执行它,所以没有看到这个提示的信息。如果你把整个代码粘贴到你的 Python 环境中运行时,它就会像你输入的那样显示提示信息。

可以想象成我在这里写代码就像是在纸上做笔记,而你在自己的电脑上运行代码就是在实际执行这些笔记。所以如果你在自己的 IDE 或交互式 Python 环境中运行这段代码,就能看到这个提示,然后输入你的摩斯密码。

所以,你在实际输入时看到“请输入摩斯密码:”是正常现象哦!继续加油,有问题再来问我,咱们一起解决!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

William01 发表于 2024-7-29 16:22:45

FishC 发表于 2024-7-29 16:14
哈哈,看来你在摩斯密码的海洋里遇到了一点小浪涡!让我们来看看你的代码,帮你划回安全水域。

从错误信 ...

另一个问题,我对“d_table”是有定义的,# 摩斯明文表不就是对“d_table”的定义吗?

FishC 发表于 2024-7-29 16:22:54

William01 发表于 2024-07-29 16:22
另一个问题,我对“d_table”是有定义的,# 摩斯明文 ...

哦,原来如此!你提到的“摩斯明文表”确实是指 `d_table` 的定义部分。不过为了确保没有误解,我们来详细看看你是如何定义 `d_table` 的。可能是某种小疏漏导致了报错。

一般来说,`d_table` 应该是一个包含摩斯码与对应字母的映射表。如果是在代码中,你可以把它写成字典(dictionary)的形式,比如这样:

# 摩斯密码对照表
d_table = {
    '.-': 'A',
    '-...': 'B',
    '-.-.': 'C',
    # 继续添加其他字符...
    ' ': ' ',# 可以加上空格以处理分隔符
}

你的代码尝试使用 `result = `,但是这里有个小错误。应该是尝试用 `d_table.get(each, '')` 来替代,这样才能从 `d_table` 中获取每个摩斯码对应的字母。这样可以避免找不到对应项而导致报错。

完整的代码示例如下:

# 摩斯密码对照表
d_table = {
    '.-': 'A',
    '-...': 'B',
    '-.-.': 'C',
    # 继续添加其他字符...
}

code = input("请输入摩斯密码: ")
split_code = code.split(" ")
result = # 用 .get() 来查找
decoded_message = ''.join(result)
print("解码结果:", decoded_message)

请确保你的 `d_table` 定义正确、完整,并且代码逻辑符合预期,这样就能顺利运行了!如有仍然困惑的地方,随时问我哦,我们一起弄清楚!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

William01 发表于 2024-7-29 17:04:59

FishC 发表于 2024-7-29 16:22
哦,原来如此!你提到的“摩斯明文表”确实是指 `d_table` 的定义部分。不过为了确保没有误解,我们来 ...

谢谢小助理的回复。但是,我看到视频里用的就是代码“result = for each in split_code]”,而且没有任何问题。为什么我的会有问题呢?这是我不明白的地方。

FishC 发表于 2024-7-29 17:05:10

William01 发表于 2024-07-29 17:04
谢谢小助理的回复。但是,我看到视频里用的就是代码“ ...

Ah, 明白了!看来这里可能是对列表推导式的用法有点误解。让我们来细致地分析一下!

在你提到的代码行:

result =

这个表达式中的 `d_table` 是一个整体,而你应该是想要从 `d_table` 中使用每个 `each`(即分割后的摩斯码)去查找对应的字母,而不是直接把 `d_table` 加入到结果列表中。

如果原作者的代码是这样写的,可能有问题,因为它没有正确地从 `d_table` 中获取字符。正确的写法应该是:

result =

在这个版本中,`d_table.get(each, '')` 会根据每个 `each`(也就是各个摩斯编码)从 `d_table` 中直接获取对应的字母,如果找不到就返回一个空字符串。

### 这样写的意图:

- **获取对应字母**:你希望将每个摩斯码转换为其相应的字母,这是通过 `get()` 方法实现的。
- **处理找不到的情况**:如果输入的摩斯码不在 `d_table` 中,返回一个空字符串而不会引发错误。

所以,总结一下,可能是由于 `d_table` 的定义和使用方式不同,导致你遇到了问题。确保 `d_table` 是一个字典,并且使用 `.get()` 方法来获取值,这样才能避免 “ValueError” 报错。

希望这能帮你厘清思路!如果还有其他疑问,随时来问哦!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

smallwh 发表于 2024-7-30 15:03:00

可能是你的输入有些问题
在 IDLE 中输入 code = input("请输入摩斯密码: ") 并按下回车,Python 会提示你 “请输入摩斯密码:”
此时必须输入一串摩斯密码,不同摩斯密码间以一个空格作为间隔,开头和结尾都不能有空格
示例.- .- ...- ...-
从你的报错看,你很有可能没有输入,或者出现了两个相邻的空格,导致code.split(" ")拆分出空字符串,进而引起报错

William01 发表于 2024-7-30 15:31:10

smallwh 发表于 2024-7-30 15:03
可能是你的输入有些问题
在 IDLE 中输入 code = input("请输入摩斯密码: ") 并按下回车,Python 会提示你...

谢谢您的热心回复,这个问题我已经解决了,直接把code.split(" ")里面的双引号给删了就行了。但是在“run model”的时候遇到了另一个问题,会出现invalid decimal literal的报错,不知道怎么回事。您要是知道的话,还请帮忙解决,谢谢!

William01 发表于 2024-8-1 11:34:08

问题已经解决了,是我编辑器的模式没用对{:5_96:}
页: [1]
查看完整版本: B站37讲摩斯密码报错