Python中yield结合if/else循环问题:法语词拼接与字典校验求助
问题排查与修正方案
先梳理你代码里的几个核心逻辑问题,正是这些问题导致功能无法正常实现:
1. 索引操作错误
在else分支中,你先执行了i +=1,再去取ary[i] + ary[i+2]——这时候ary[i]实际上是原来的*(也就是原索引i+1的元素),完全不是你要拼接的两个目标单词。正确的做法是在修改i之前,就把要拼接的词(ary[i] + ary[i+2])添加到列表l里。
2. 循环步长错误
当你找到*并处理完拼接逻辑后,应该让i增加3(跳过当前单词、*、下一个单词这三个元素),而不是增加2。否则会导致下一次循环重复处理已跳过的元素,引发索引混乱。
3. 循环边界问题
你的while i < size-2会漏掉列表末尾可能存在的*分隔对(比如列表最后三个元素是a * b的情况),应该调整循环条件为i < size,然后在循环内部判断当前位置的下一个元素是否为*,再做对应处理。
4. 大小写匹配问题
你把词典里的单词都转成了小写,但拼接后的单词是原列表里的大小写(比如Bienvenue),直接用in dic判断会因为大小写不匹配导致误判,所以拼接后要转成小写再去对比。
修正后的代码
from nltk.tokenize import word_tokenize # 别忘了导入word_tokenize工具 words = ['Bien', '*', 'venue', 'pour', 'les','engage', '*', 'ment','trop', 'de', 'YIELD', 'peut','être','contre', '*', 'productif' ] with open ('Fr-dictionary.txt') as fr: dic = word_tokenize(fr.read().lower()) l = [] # 存储不存在于词典的拼接词 def join_asterisk(ary): i, size = 0, len(ary) while i < size: # 检查当前元素的下一个是否是*,并且存在下下个元素 if i + 2 < size and ary[i+1] == '*': combined_word = ary[i] + ary[i+2] # 转小写后匹配词典,避免大小写差异导致误判 if combined_word.lower() in dic: yield combined_word else: # 拼接词不存在,添加到l列表,同时返回原来的两个单词 yield ary[i] yield ary[i+2] l.append(combined_word) # 跳过这三个元素(当前词、*、下一个词) i += 3 else: # 没有*分隔符,直接返回当前元素 yield ary[i] i += 1 # 执行并查看结果 result_list = list(join_asterisk(words)) print("结果列表:", result_list) print("不存在的拼接词:", l)
代码说明
- 循环条件改为
i < size,确保所有元素都能被遍历处理 - 处理
*时先判断i+2 < size,避免出现索引越界错误 - 拼接后的单词转成小写再与词典对比,解决大小写不匹配的问题
- 当拼接词不存在于词典时,既把拼接词存入
l,也将原单词返回至结果列表(如果你的需求是结果列表不保留原单词,可以去掉对应的yield语句) - 处理完
*相关的三个元素后,i +=3,确保不会重复处理元素
内容的提问来源于stack exchange,提问作者Nadia Santos
相关产品推荐
相关产品推荐

