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

车牌验证程序出现TypeError:字符串索引需为整数的问题排查

个性化车牌验证程序错误修复

问题场景

你正在编写一个验证个性化车牌有效性的程序,规则如下:

  • 必须以至少两个字母开头
  • 字符数在2-6之间,仅含字母或数字
  • 数字只能在末尾,且第一个数字不能是0
  • 禁止使用句号、空格或标点符号

原代码执行输入CS50时触发TypeError: string indices must be integers错误,错误出现在is_valid函数的循环部分。

错误原因

原代码中for i in s的循环变量i是字符串的字符本身,而非索引值。比如遍历CS50时,i依次是'C'、'S'、'5'、'0',此时执行s[i]相当于用字符作为索引,自然会触发类型错误。

另外原代码的数字校验逻辑也存在漏洞,比如无法正确判断数字是否仅出现在末尾、数字后是否混有字母等问题。

修复后的代码

def main():
    plate = input("Plate: ")
    print("Valid" if is_valid(plate) else "Invalid")

def is_valid(s):
    # 规则2:长度必须在2-6之间
    if not (2 <= len(s) <= 6):
        return False
    # 规则1:前两个字符必须是字母
    if not (s[0].isalpha() and s[1].isalpha()):
        return False
    # 规则4:仅含字母或数字
    if not s.isalnum():
        return False
    
    # 规则3:数字只能在末尾,且第一个数字不能是0
    found_digit = False
    for idx, char in enumerate(s):
        if char.isdigit():
            found_digit = True
            # 第一个出现的数字不能是0
            if char == '0' and not found_digit:
                return False
        elif found_digit:
            # 出现数字后再遇到字母,直接判定无效
            return False
    return True

main()

关键修复点说明

  1. 循环变量修正:改用enumerate(s)同时获取索引和字符,彻底避免用字符作为索引的错误。
  2. 数字逻辑重构:
    • 用found_digit标记是否已经出现过数字
    • 一旦出现数字后再遇到字母,直接返回无效(符合数字只能在末尾的规则)
    • 检查第一个出现的数字是否为0,确保开头数字合法
  3. 逻辑简化:将返回0/1改为更符合Python习惯的True/False,条件判断语句更直观易读。

内容的提问来源于stack exchange,提问作者Ignatius the Learner

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 21:06:15