如何对值为列表的字典使用fuzzy process.extract实现模糊匹配
字典列表值的字符串模糊匹配实现方案
一、实现指定格式的匹配结果输出
先修正你代码中的几个问题:
- 字典的键
basic、framework需要加引号(Python字符串键必须用引号包裹); - 变量
st是字符串,for i in st会遍历每个字符,不符合需求,直接用st作为匹配目标即可; floatRemover函数未定义,若用于清理字符串可自行补充,这里假设目标字符串已处理完毕。
使用fuzzywuzzy库(需先安装:pip install fuzzywuzzy python-Levenshtein),逐个计算列表元素与目标字符串的匹配分数,再整理成你需要的格式:
from fuzzywuzzy import fuzz, process st = "HTML" skills = { "basic": ["HTML", "CSS", "JS"], "framework": ["Angular", "React"] } # 存储最终匹配结果 result = [] for category, skill_list in skills.items(): # 计算当前分类下每个技能与目标字符串的匹配分数 match_scores = [(skill, fuzz.ratio(st, skill)) for skill in skill_list] # 按期望格式添加到结果 result.append((match_scores, category)) print(result)
输出结果示例(与你期望的格式一致):
[([('HTML', 100), ('CSS', 30), ('JS', 22)], 'basic'), ([('Angular', 25), ('React', 20)], 'framework')]
二、设置分数阈值过滤结果
如果需要只保留匹配分数高于指定阈值(如80)的元素,并整理为字典格式,可添加过滤逻辑:
from fuzzywuzzy import fuzz, process st = "HTML" threshold = 80 skills = { "basic": ["HTML", "CSS", "JS"], "framework": ["Angular", "React"] } filtered_result = {} for category, skill_list in skills.items(): # 过滤出分数高于阈值的技能 matched_skills = [skill for skill in skill_list if fuzz.ratio(st, skill) >= threshold] # 仅保留有匹配结果的分类 if matched_skills: filtered_result[category] = matched_skills print(filtered_result)
输出结果:
{'basic': ['HTML']}
补充说明
fuzz.ratio是基础字符串匹配分数计算方法,你也可以根据需求使用fuzz.partial_ratio(部分匹配)等其他方法;- 若需要更高效的批量匹配,可结合
process.extractBests方法,但需调整参数适配格式需求。
内容的提问来源于stack exchange,提问作者Ramu Sompalli
相关产品推荐
相关产品推荐

