Python 3.6 带字母电话号码转数字功能异常排查求助
解决字母转电话号码数字的输出异常问题
嘿,我一眼就看到问题出在哪啦!你的代码逻辑犯了一个典型的错误——没有拼接结果,而是每次都覆盖了整个变量,这才导致最后所有字母位置都变成了最后一个字母对应的数字。
问题根源分析
你看,你初始化number = 1(这本身就不对,应该用字符串来拼接结果),然后在循环里每次遇到字母就直接给number赋值单个数字(比如number = 2)。这意味着每循环一次,number就被完全替换成当前字母对应的数字,循环结束后自然只剩下最后一个字母的数字值。再加上你可能后续错误地把这个数字重复填充了所有字母的位置,就出现了你看到的18009999999这种结果。
修正后的代码实现
正确的思路应该是用一个空字符串来逐步拼接每个字符对应的数字,同时保留原字符串中的数字字符。这里给你两种实现方式:
方式一:用条件判断逐个处理
def transNum(string): number = "" # 初始化为空字符串,用来拼接最终结果 for ch in string: # 如果是数字,直接添加到结果里 if ch.isdigit(): number += ch elif ch.lower() in "abc": number += "2" elif ch.lower() in "def": number += "3" elif ch.lower() in "ghi": number += "4" elif ch.lower() in "jkl": number += "5" elif ch.lower() in "mno": number += "6" elif ch.lower() in "pqrs": number += "7" elif ch.lower() in "tuv": number += "8" elif ch.lower() in "wxyz": number += "9" # 可选:处理非法字符,比如直接忽略或者保留原字符 # else: # number += ch return number # 测试示例 print(transNum("1800GOTJUNK")) # 输出:18004685865 print(transNum("1800adgjmptw")) # 输出:18002456789
方式二:用字典映射(更简洁易维护)
如果后续需要调整映射规则,用字典会更方便:
def transNum(string): # 先定义字母到数字的映射字典 char_to_num = { 'a':'2', 'b':'2', 'c':'2', 'd':'3', 'e':'3', 'f':'3', 'g':'4', 'h':'4', 'i':'4', 'j':'5', 'k':'5', 'l':'5', 'm':'6', 'n':'6', 'o':'6', 'p':'7', 'q':'7', 'r':'7', 's':'7', 't':'8', 'u':'8', 'v':'8', 'w':'9', 'x':'9', 'y':'9', 'z':'9' } number = "" for ch in string: if ch.isdigit(): number += ch else: # 转小写后查字典,找不到的字符默认保留原字符 number += char_to_num.get(ch.lower(), ch) return number
验证效果
运行上面的代码,输入1800GOTJUNK会正确输出18004685865,输入1800adgjmptw也会得到18002456789,完全符合你的需求。
内容的提问来源于stack exchange,提问作者nickchamb727
相关产品推荐
相关产品推荐

