开发含通配符的搜索函数时,字符串切片循环移除字符失效求助
通配符搜索函数的字符移除问题解决
你的问题出在正序删除字符时的索引偏移:当你从前往后删除apusana的字符时,每删一个字符,后面的字符都会往前挪一位,导致后续的索引不再对应原单词的正确位置。比如原单词是"testi",要删索引1和3,第一次删1后变成"tsti",再用原索引3去删,实际删的是原单词的第4个字符(i),而不是原本要删的第3个字符(s)。
快速修复:倒序删除索引
把处理apusana的循环改成倒序遍历indeksit,从最大的索引开始删,这样前面的索引不会受后面删除操作的影响:
if "." in hakusana: indeksit = [] while hakusana.count(".") > 0: i = hakusana.index(".") hakusana = hakusana[:i] + hakusana[i + 1:] indeksit.append(i + len(indeksit)) for sana in sanalista: if len(hakusana) + len(indeksit) == len(sana): apusana = sana # 倒序遍历索引,避免删除后索引偏移 for i in reversed(indeksit): apusana = apusana[:i] + apusana[i + 1:] if apusana == hakusana: osumat.append(sana)
更简洁的写法:直接字符对比
其实完全不需要先删除字符再匹配,直接逐个对比搜索词和单词的字符,遇到通配符"."就跳过检查,逻辑更清晰也更高效:
osumat = [] for sana in sanalista: # 长度不一致直接跳过 if len(sana) != len(hakusana): continue # 逐个字符对比 match_ok = True for h_c, s_c in zip(hakusana, sana): if h_c != "." and h_c != s_c: match_ok = False break if match_ok: osumat.append(sana)
这种写法不需要处理索引删除的问题,直接判断每个位置的字符是否符合要求,完全规避了索引偏移的坑。
内容的提问来源于stack exchange,提问作者Arttu
相关产品推荐
相关产品推荐

