Python实现手机号数字转单词 运行报KeyError:'9'如何解决
问题说明
运行手机号转对应英文单词的Python代码时,抛出KeyError: '9'错误,原代码如下:
phone = input("Phone: ") if len(phone) < 10: print("Phone number should be at least 10 digit long!") else: li = [] for item in range(0, 10, 1): li.append(phone[item]) print(li) word_num = { 0: "Zero", 1: "One", 2: "Two", 3: "Three", 4: "Four", 5: "Five", 6: "Six", 7: "Seven", 8: "Eight", 9: "Nine" } for item in li: print(word_num[int(item)])
错误原因
- 作用域逻辑bug:存储手机号位的列表
li定义在else分支内,当输入手机号长度不足10位时,li不会被初始化,后续执行打印、遍历li的逻辑会直接报错。如果是在交互式环境下连续运行代码,li会残留上次运行的异常值,很容易触发类型不匹配的键错误。 - 键类型不匹配(触发KeyError的核心原因):
word_num字典的键是整数类型的0-9,如果你实际运行的代码中遍历查找时漏写了int()转换,直接传入从字符串截取的字符(比如字符串'9'),字典里不存在字符串类型的键,就会抛出KeyError: '9'。 - 缺少输入内容校验:当前代码只校验了输入长度,没有判断输入是否全为数字,一旦用户输入非数字字符,转换整数时也会报错。
修复方案
调整代码结构,把所有转换逻辑收拢到合法输入分支内,补全校验规则,明确键的类型匹配,修复后代码如下:
phone = input("Phone: ").strip() # 统一做输入合法性校验 if len(phone) < 10 or not phone.isdigit(): print("Invalid input: phone number should be at least 10 digits and contain only numbers!") else: word_num = { 0: "Zero", 1: "One", 2: "Two", 3: "Three", 4: "Four", 5: "Five", 6: "Six", 7: "Seven", 8: "Eight", 9: "Nine" } output = [] # 遍历手机号每一位,明确转整数后查字典 for ch in phone: output.append(word_num[int(ch)]) print(' '.join(output))
内容的提问来源于stack exchange,提问作者Sachit
相关产品推荐
相关产品推荐

