Python相似车牌字符串判断代码提前返回True问题排查
车牌相似性校验代码问题修复
需求规则
判断两个车牌字符串是否相同或视觉相似,校验规则如下:
- 属于同一分组的字符视为相似,分组为
[["0", "O", "Q"], ["1", "I", "T"], ["2", "Z"], ["5", "S"], ["8", "B"]] - 所有对应位置的字符都满足相同/相似要求才返回True,否则返回False
- 车牌中的空格会先被移除再参与校验
报错现象
现有代码大部分测试用例可通过,但两个用例结果不符合预期:
"BOX"与"B0B"对比时代码返回True,实际应为False"OXB"与"0BX"对比也存在相同问题
现有问题代码
from array import * def similar_license_plates(plate1: str, plate2: str) -> bool: p1 = plate1.replace(" ","") p2 = plate2.replace(" ","") if p1 == p2: return True if len(p1) != len(p2): return False else: l = [["0", "O", "Q"], ["1", "I", "T"], ["2", "Z"], ["5", "S"], ["8", "B"]] x = list(zip(p1, p2)) for a, b in x: if a == b: continue for c in l: if a in c: if b in c: return True return False if a == b: return True return False
问题根因
- 逻辑提前终止:只要任意一对对应位置的字符符合相似规则,就直接返回True,没有校验剩余所有位置的字符
- 错误分支返回:只要某一对字符不在同一个分组,就直接返回False,未完成全量字符校验
- 存在大量冗余的重复判断逻辑,干扰正常校验流程
修复后代码
def similar_license_plates(plate1: str, plate2: str) -> bool: # 移除所有空格后预处理 p1 = plate1.replace(" ", "") p2 = plate2.replace(" ", "") # 长度不一致直接返回False if len(p1) != len(p2): return False # 构建字符到分组ID的映射表,提升查询效率 group_map = {} groups = [["0", "O", "Q"], ["1", "I", "T"], ["2", "Z"], ["5", "S"], ["8", "B"]] for group_id, group_chars in enumerate(groups): for char in group_chars: group_map[char] = group_id # 逐个校验对应位置的字符 for char1, char2 in zip(p1, p2): # 字符相同直接跳过当前校验 if char1 == char2: continue # 任意字符不在分组中,或两个字符不属于同一分组,直接返回False if char1 not in group_map or char2 not in group_map or group_map[char1] != group_map[char2]: return False # 所有位置校验全部通过才返回True return True
内容的提问来源于stack exchange,提问作者parmida
相关产品推荐
相关产品推荐

