Python带布尔判断的循环仅执行一次 停用词列表匹配逻辑问题排查
问题分析
- 变量
x的初始化位置错误:你将x = 0放在了遍历wList的for循环内部,每处理一个wList的元素,x都会被重置为0,永远只会和stopWords的第一个元素'in'对比。哪怕某次匹配成功后x自增1,下一轮循环又会被重置回0,这就是循环仅执行一次的核心原因。 - 匹配逻辑存在缺陷:当前逻辑仅能匹配
stopWords的固定位置元素,没有覆盖整个停用词列表的匹配能力,不符合对比两个列表元素的需求。 - 文件句柄未正确释放:代码打开文件后没有调用
close()方法,可能导致写入内容丢失,也会不必要的占用系统资源。
修复方案
根据需求,分两种场景给出修复代码:
场景1:只要wList中的元素属于停用词列表,就写入对应内容
这是绝大多数停用词过滤的需求,直接用集合成员判断即可,效率更高:
def test(wList,fList): # with上下文管理器会自动关闭文件,不需要手动调用close with open("ignore.txt","w") as outfile: # 停用词转成集合,in判断的时间复杂度为O(1),远高于列表的O(n) stopWords = {'in','it','a','an','and','to','of','the','for'} # 用zip同时遍历两个列表的对应元素,不需要手动维护索引 for word, f_val in zip(wList, fList): if word in stopWords: print(word, f_val, file=outfile)
场景2:需要严格按stopWords的顺序匹配,匹配到一个后再匹配下一个停用词
如果你确实需要按stopWords的排序依次匹配,匹配成功后才移动到下一个停用词做后续匹配,将x的初始化移到循环外部即可:
def test(wList,fList): with open("ignore.txt","w") as outfile: stopWords = ['in','it','a','an','and','to','of','the','for'] x = 0 # x初始化移到循环外部 stop_len = len(stopWords) for word, f_val in zip(wList, fList): # 所有停用词都匹配完成后直接退出循环,避免无效遍历 if x >= stop_len: break if word == stopWords[x]: print(word, f_val, file=outfile) x += 1
内容的提问来源于stack exchange,提问作者Jack Krebs
相关产品推荐
相关产品推荐

