Python字典反转程序故障:输入数字串123出现输出错误
问题分析与修复
错误原因
问题核心是循环末尾无条件执行的letters_output.append(item)语句:
- 输入字母时,字母分支未向
letters_output添加内容,循环末尾添加当前字母,最终列表长度为3,符合判断条件; - 输入数字时,数字分支已将映射字母加入
letters_output,循环末尾又追加数字字符本身,导致列表长度变为6(3个映射字母+3个数字字符),触发了Error: More than three letters found.错误。
另外注意:你需求示例中输入123应输出s,e,m,但当前major_system里1对应t、2对应n,后续可根据需求调整字典映射。
修复后的代码
# Major systems dictionaries major_system = { 0: "s, z", 1: "t", 2: "n", 3: "m", 4: "r", 5: "l", 6: "g j", 7: "k", 8: "f, th", 9: "b", } major_system_2 = { 0: "oo", 1: "a", 2: "e", 3: "i", 4: "o", 5: "u", 6: "A", 7: "E", 8: "I", 9: "O", } major_system_3 = { 0: "s, z", 1: "t", 2: "n", 3: "m", 4: "r", 5: "l", 6: "g j", 7: "k", 8: "f, th", 9: "b", } # 生成反转字典 reversed_major_system_1 = {value.strip(): key for key, values in major_system.items() for value in values.split(", ")} reversed_major_system_2 = {value: key for key, value in major_system_2.items()} reversed_major_system_3 = {value.strip(): key for key, values in major_system_3.items() for value in values.split(", ")} user_input = input("Please enter 3 numbers or letter without spaces ") if len(user_input) == 3: numbers_output = [] letters_output = [] valid_input = True for item in user_input: if item.isdigit(): # 处理数字输入 number = int(item) letter1 = major_system.get(number, "Invalid") letter2 = major_system_2.get(number, "Invalid") letter3 = major_system_3.get(number, "Invalid") if letter1 != "Invalid" and letter2 != "Invalid" and letter3 != "Invalid": numbers_output.append(item) # 添加映射的第一个字母到letters_output letters_output.append(letter1.split(", ")[0]) else: valid_input = False elif item.isalpha(): # 处理字母输入 number1 = reversed_major_system_1.get(item, "Invalid") number2 = reversed_major_system_2.get(item, "Invalid") number3 = reversed_major_system_3.get(item, "Invalid") if number1 != "Invalid": numbers_output.append(str(number1)) elif number2 != "Invalid": numbers_output.append(str(number2)) elif number3 != "Invalid": numbers_output.append(str(number3)) else: valid_input = False # 字母输入时添加原字母到letters_output letters_output.append(item) else: valid_input = False if valid_input: print(f'Input {user_input}') if numbers_output: print(f'Numbers output: {", ".join(numbers_output)}') if len(letters_output) == 3: print(f'Letters output: {", ".join(letters_output)}') else: print("Error: More than three letters found.") else: print("Error: One or more inputs do not have a valid mapping.") else: print("Error: please enter exactly 3 characters (numbers or letters) without spaces.")
修复说明
- 移除循环末尾的
letters_output.append(item),改为在对应分支内添加内容:- 数字输入分支:添加字典映射的字母到
letters_output; - 字母输入分支:添加原字母到
letters_output,同时补充了无效字母输入的valid_input = False判断(原代码此处遗漏)。
- 数字输入分支:添加字典映射的字母到
- 现在输入123时,
letters_output为['t', 'n', 'm'],长度为3,可正常输出;输入klm时保持原有正确输出。 - 若要实现输入123输出
s,e,m,只需调整major_system的映射,比如将1: "t"改为1: "s",2: "n"改为2: "e"。
内容的提问来源于stack exchange,提问作者user27867303
相关产品推荐
相关产品推荐

