You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 19:10:47