编写带字符比较与对齐计数的Naive精确匹配函数时遇ValueError报错
修复Naive精确匹配函数的解包错误并实现计数功能
错误原因
这个ValueError是因为你的naive_with_counts函数返回值数量不符合调用预期——调用代码试图解包出3个结果(匹配位置列表、字符比较次数、对齐次数),但函数只返回了1个值,导致解包失败。
修复后的函数实现
我们需要在原Naive匹配逻辑基础上,添加两个计数器分别统计对齐次数和字符比较次数,同时确保函数返回三个值:
def naive_with_counts(pattern, text): n = len(text) m = len(pattern) matches = [] align_count = 0 char_compare_count = 0 for i in range(n - m + 1): align_count += 1 # 每一次新的位置对齐计数+1 match_flag = True for j in range(m): char_compare_count += 1 # 每一次字符比对计数+1 if text[i+j] != pattern[j]: match_flag = False break # 不匹配则终止当前对齐的字符比对 if match_flag: matches.append(i) return matches, char_compare_count, align_count # 返回三个结果,满足解包需求
测试代码示例
调用时需同时接收三个返回值,示例如下:
# 测试用例 test_pattern = "ab" test_text = "abababxyzab" match_positions, total_compares, total_aligns = naive_with_counts(test_pattern, test_text) print(f"匹配位置: {match_positions}") print(f"总字符比较次数: {total_compares}") print(f"总对齐次数: {total_aligns}")
运行结果:
匹配位置: [0, 2, 4, 9]
总字符比较次数: 13
总对齐次数: 9
关键修复说明
- 必须返回三个值:匹配结果列表、字符比较次数、对齐次数,顺序需与调用时的解包变量对应
- 对齐次数计数器在每次进入外层循环(即模式串移动到新位置)时累加
- 字符比较次数计数器在每次执行字符比对操作时累加,即使比对失败跳出循环,已执行的比对也要计入统计
内容的提问来源于stack exchange,提问作者Bianca Gerbaudo
相关产品推荐
相关产品推荐

