Python实现词表全匹配的句子筛选 修复代码返回全True的问题
问题场景
现有两个待处理的列表:
list1存储待检测的句子集合list2存储需要匹配的目标词汇集合
需要逐句检测list1中的每个条目,输出和list1长度一致的布尔序列,标记对应位置的句子是否满足匹配规则。
本次测试使用的样例数据:
- list1 = ['p jthputmxy xpih t zdamz', 'l kefylcbfl tpij p jonvs', 'c olqlyfxew ksah p opjto', 'o cbfolbbwa fcha b xcruo', 'x iirvablmi dvqg i jjguy', 'c ocqlyfoew ksrh p opato', 'n cyjelcxxy xlip t kvrks', 'l kajltafti egei a bzzts', 'p ctjpltfxa xgia t bdrms', 'a cavalaria esta a norte']
- list2 = ['atacar', 'esperar', 'noite', 'base', 'sul', 'norte', 'cavalaria', 'esta', 'a', 'pato']
样例对应的期望输出为:[False, False, False, False, False, False, False, False, False, True]
现有实现的核心Bug
当前使用的实现代码为:
test = [all(i for i in list2) for f in list1] return test
实际运行后会返回长度与list1一致的全True列表,和期望结果偏差明显,问题根源非常明确:
- 列表推导式中传入
all()的生成器表达式(i for i in list2),完全没有使用外层循环的当前句子变量f,实际等价于判断“list2中所有元素是否为布尔真”。由于list2里存储的都是非空字符串,这个判断永远返回True,和待检测的句子没有任何关联。 - 缺失最核心的匹配逻辑:没有对list2中的每个目标词,检查其是否真的存在于当前遍历的句子中,整体是恒真的无意义判断。
修正方案
按原始需求(句子需包含list2的全部目标词汇)实现
如果需求确实是判断句子是否覆盖list2里的所有目标词,只需要把当前句子变量传入匹配判断环节即可,修正后的代码为:
test = [all(target in sentence for target in list2) for sentence in list1] return test
如果需要避免子串误匹配(比如把句子里的
opato错判为包含目标词pato),可以将句子拆分为独立单词集合后再做校验,示例:test = [set(sentence.split()).issuperset(set(list2)) for sentence in list1]
匹配规则对齐样例期望
如果运行上述代码发现结果和给定的样例期望不一致,说明实际匹配规则和最初的需求描述有偏差。当前样例的期望输出,实际对应的规则是“句子拆分后的所有独立单词,都能在list2的词汇集合中找到”,此时可以调整代码为:
test = [all(word in list2 for word in sentence.split()) for sentence in list1]
运行这段代码的结果和给定样例的期望完全一致:前9个句子拆分后都包含无意义的乱拼词汇,不在list2的范围内,因此返回False;最后一个句子的拆分词汇(a、cavalaria、esta、norte)全部命中list2中的元素,因此返回True。
内容的提问来源于stack exchange,提问作者Geo
相关产品推荐
相关产品推荐

