Python匹配字典键对值求和结果异常的问题排查与修复
Python字典键匹配后分值求和异常修复
问题现象
实现文本关键词匹配对应分值求和逻辑时,测试输入文本为bread sourdough crusts,预期求和结果为17,实际运行输出为20,结果不符合预期。
涉及的原有代码片段如下:
- 输入获取代码
text=input("Enter your text here: )
- 分值字典定义
bread = {"bread": 7, "sourdough crusts": 10}
- 正则匹配代码
result = re.findall('|'.join(bread), text)
- 错误求和代码
for sentence, rating in bread.items(): ssum = 0 for i in range(len(result)): ssum = ssum + rating print("Sum: " + str(ssum))
错误原因
代码存在两处核心逻辑错误,另有一处正则匹配的隐藏隐患:
- 求和变量初始化位置错误:
ssum = 0被写在遍历字典的外层循环内部,每次切换遍历的键值对时,之前累加的结果会被直接清零,最终输出的只是最后一个遍历到的分值的计算结果。 - 累加逻辑和匹配结果完全脱钩:内层循环仅按照匹配结果列表的长度做固定次数的分值累加,完全不校验当前遍历的字典键和实际匹配到的内容是否对应,相当于只要匹配列表有N个元素,就把当前字典项的分值重复加N次。
以测试用例为例:遍历到第二个键值对("sourdough crusts", 10)时,ssum被重置为0,匹配结果长度为2就累加2次10,最终得到错误结果20。 - 正则匹配隐患:直接拼接字典键生成正则多选分支时,默认按字典遍历顺序匹配,若短键排在长键前面,会提前截断长词组的内容,导致长关键词匹配失败,带来额外的计算错误。
修复方案
按照以下逻辑调整代码即可得到正确结果:
- 将求和变量的初始化移到所有循环外部,避免累加值被意外重置
- 直接遍历正则匹配到的所有关键词,从字典中取对应分值累加,不需要双层循环遍历字典
- 生成正则时对关键词按长度降序排序,优先匹配更长的词组,避免短键截断长键
- 补全原有代码中
input函数缺失的引号,记得提前导入re模块
修复后的完整可运行代码:
import re # 获取输入文本,可在此处补充移除标点、自动纠错的预处理逻辑 text = input("Enter your text here: ") # 定义关键词对应分值 score_map = {"bread": 7, "sourdough crusts": 10} # 生成长度优先匹配的正则表达式 pattern = '|'.join(sorted(score_map.keys(), key=lambda x: len(x), reverse=True)) matched_keys = re.findall(pattern, text) # 计算总分 total = sum(score_map[key] for key in matched_keys) print(f"Sum: {total}")
使用测试用例bread sourdough crusts运行上述代码,会正确匹配到['bread', 'sourdough crusts']两个关键词,累加得到17,符合预期。
内容的提问来源于stack exchange,提问作者user19224573
相关产品推荐
相关产品推荐

