phoneNumberMnemonics函数报错:'NoneType' object is not iterable求助
电话号码助记符代码报错分析与修复
问题代码
def phoneNumberMnemonics(phoneNumber): result = [] return helper(phoneNumber, result) def helper(phoneNumber, result): if len(phoneNumber) == 0: result.append("") return result new_number = phoneNumber[0] print(new_number) last_iteration = helper(phoneNumber[1:],result) new_number_letter = numberToLetter(new_number) for item in last_iteration: for letter in new_number_letter: result.append(letter + item) return result def numberToLetter(input): map = {1: ["1"], 2: ["a","b","c"], 3: ["d", "e", "f"], 4: ["g", "h", "i"], 5: ["j", "k", "l"], 6: ["m", "n", "o"], 7: ["p", "q", "r", "s"], 8: ["t", "u", "v"], 9: ["w", "x", "y", "z"], 0: ["0"]} return map.get(input) # print(numberToLetter(5)) print(phoneNumberMnemonics("890"))
报错信息
File "/Users/pythonProject/main.py", line 18, in helper for letter in new_number_letter: TypeError: 'NoneType' object is not iterable
错误原因
核心问题是类型不匹配:
- 传入
numberToLetter的参数是字符串类型(比如输入"890"时,依次传入的是"8"、"9"、"0") - 但函数内的字典
map使用的是整数类型的键(1、2、0等) - 当用
map.get(input)查找字符串键时,字典中没有对应条目,返回None,后续遍历None就触发了TypeError。
修复方案
方案1:修改字典键为字符串类型
直接把字典的键改成和输入参数一致的字符串:
def numberToLetter(input): map = {"1": ["1"], "2": ["a","b","c"], "3": ["d", "e", "f"], "4": ["g", "h", "i"], "5": ["j", "k", "l"], "6": ["m", "n", "o"], "7": ["p", "q", "r", "s"], "8": ["t", "u", "v"], "9": ["w", "x", "y", "z"], "0": ["0"]} return map.get(input)
方案2:将输入参数转为整数类型
把传入的字符串参数转换成整数后再查找字典:
def numberToLetter(input): map = {1: ["1"], 2: ["a","b","c"], 3: ["d", "e", "f"], 4: ["g", "h", "i"], 5: ["j", "k", "l"], 6: ["m", "n", "o"], 7: ["p", "q", "r", "s"], 8: ["t", "u", "v"], 9: ["w", "x", "y", "z"], 0: ["0"]} return map.get(int(input))
额外优化:修复递归逻辑冗余
原代码共享同一个result列表会导致最终结果包含大量冗余的空字符串和重复组合,建议调整递归逻辑,让每一层返回当前的组合结果,避免共享列表:
优化后的完整代码:
def phoneNumberMnemonics(phoneNumber): return helper(phoneNumber) def helper(phoneNumber): if len(phoneNumber) == 0: return [""] new_number = phoneNumber[0] last_iteration = helper(phoneNumber[1:]) new_number_letter = numberToLetter(new_number) current_results = [] for item in last_iteration: for letter in new_number_letter: current_results.append(letter + item) return current_results def numberToLetter(input): num_map = {"1": ["1"], "2": ["a","b","c"], "3": ["d", "e", "f"], "4": ["g", "h", "i"], "5": ["j", "k", "l"], "6": ["m", "n", "o"], "7": ["p", "q", "r", "s"], "8": ["t", "u", "v"], "9": ["w", "x", "y", "z"], "0": ["0"]} return num_map.get(input) print(phoneNumberMnemonics("890"))
运行后会输出正确的助记符列表:
['twa', 'twb', 'twc', 'txa', 'txb', 'txc', 'tya', 'tyb', 'tyc', 'tza', 'tzb', 'tzc', 'uwa', 'uwb', 'uwc', 'uxa', 'uxb', 'uxc', 'uya', 'uyb', 'uyc', 'uza', 'uzb', 'uzc', 'vwa', 'vwb', 'vwc', 'vxa', 'vxb', 'vxc', 'vya', 'vyb', 'vyc', 'vza', 'vzb', 'vzc']
内容的提问来源于stack exchange,提问作者Jacky Liu
相关产品推荐
相关产品推荐

