Python自定义word_search函数无匹配时返回None而非空列表[]问题
问题说明
自定义word_search函数做关键词匹配时,无匹配场景下预期返回空列表[],实际运行返回None;传入文档内存在的关键词(例如'casino')时可以正常返回结果[0]。
可复现代码:
def word_search(doc_list, keyword): for i in doc_list: list = [] words = i.split() for n in words: if keyword == n.rstrip('.,').lower(): list.append(doc_list.index(i)) return list word_search(['The Learn Python Challenge Casino', 'They bought a car, and a horse', 'Casinoville?'], 'ear')
故障原因
- 函数没有设置全局兜底返回逻辑:Python函数如果没有走到显式
return分支,执行完所有代码后默认返回None。当前代码只有匹配到关键词时才会触发return,所有内容遍历完都没匹配的场景下,函数直接结束运行,自然返回None。 - 结果列表初始化位置错误:用来存匹配结果的列表写在了外层遍历文档的for循环内部,每遍历一个新文档就会被重置为空列表,就算后续要支持多文档匹配,之前存好的匹配结果也会被清空。
- 匹配逻辑存在疏漏:只对遍历到的单词做了转小写、去末尾标点的处理,没有对传入的
keyword做相同的规则对齐,传入大写关键词时会直接匹配失败;另外用doc_list.index(i)获取文档索引的写法有缺陷,如果文档列表里存在重复内容,永远只会返回第一个重复项的位置,拿不到正确索引;顺带一提,用list做变量名会覆盖Python内置的列表类型,不是好习惯。
修复方案
调整结果列表的初始化位置到循环外,补全无匹配时的显式返回,对齐关键词和待匹配文本的预处理规则,用enumerate直接拿遍历索引避免重复内容导致的索引错误,修复后代码如下:
def word_search(doc_list, keyword): match_res = [] # 关键词提前做小写转换,和待匹配词规则对齐 keyword = keyword.lower() # 直接拿遍历索引,不用事后查位置 for doc_idx, doc in enumerate(doc_list): words = doc.split() for word in words: # 清理单词末尾的常见标点后转小写 clean_word = word.rstrip('.,?!').lower() if clean_word == keyword: match_res.append(doc_idx) # 当前文档已经匹配到,不用继续遍历剩下的单词 break # 不管有没有匹配结果,都显式返回列表 return match_res
验证效果
- 传入无匹配关键词
'ear',返回预期空列表[] - 传入存在的关键词
'casino',正确返回[0] - 传入带标点的匹配项关键词
'car',可以正确识别第二个文档里的car,,返回[1]
内容的提问来源于stack exchange,提问作者Paul Fort
相关产品推荐
相关产品推荐

