difflib.get_close_matches索引异常:为何用tokens[j]会导致Asst残留于地址前?
关于difflib.get_close_matches匹配逻辑的问题
当使用difflib.get_close_matches(tokens[0], jobList, n=1, cutoff=0.85)时能得到预期输出,但把匹配目标改成tokens[j]后,token“Asst”仍会出现在地址“Wyndrum”之前,请问问题原因是什么?
测试代码
# Short test removes job descriptions from in front of address trailing address strings testList = ['21 Sharp Crescent _Wainuiomata Shop Asst','Shop Asst Wyndrum Avenue _Lower_Hutt Housewife','Housewife'] jobList = ['Asst','Housewife','Shop'] import difflib newList = [] for i in range(len(testList)): tokens = testList[i].split() for j in range(len(tokens)): print("tokens[j]",tokens[j],"tokens[0]",tokens[0]) result = difflib.get_close_matches(tokens[0], jobList, n=1, cutoff=0.85) if result: while tokens and tokens[0] == result[0]: tokens.pop(0) else: newString = ' '.join(tokens) newList.append(newString) break for i in range(len(newList)): print(newList[i])
预期正确输出
21 Sharp Crescent _Wainuiomata Shop Asst Wyndrum Avenue _Lower_Hutt Housewife
调试打印信息
tokens[j] 21 tokens[0] 21 tokens[j] Shop tokens[0] Shop tokens[j] Wyndrum tokens[0] Asst tokens[j] _Lower_Hutt tokens[0] Wyndrum tokens[j] Housewife tokens[0] Housewife
问题原因分析
1. 原代码内层for j循环完全无效
你在循环里根本没用到tokens[j],始终以tokens[0]作为匹配目标,这也是为什么改成tokens[j]后逻辑直接混乱——原代码的遍历逻辑和匹配逻辑完全脱节。
2. 改用tokens[j]后出现索引错位
当你把匹配目标换成tokens[j]时,遍历过程中同时修改了tokens列表(执行pop(0)),导致遍历的索引j和实际token的位置错位。比如第二个测试用例Shop Asst Wyndrum...:
- j=0时匹配到
Shop,执行pop(0)后,tokens变成['Asst', 'Wyndrum', ...] - j继续递增到1,此时取的是新
tokens[1]也就是Wyndrum,直接跳过了Asst的匹配,导致Asst没被移除,留在了地址前面。
3. 终止逻辑错误
原代码只要tokens[0]匹配不到jobList内容,就直接拼接当前tokens并break,这种逻辑无法处理非开头的job token(比如第一个测试用例末尾的Shop Asst需要保留),同时也会因为提前break导致后续可能的开头job token没被处理。
修正后的核心逻辑
如果你的需求是移除开头连续的job类token,保留后续内容,可以用以下逻辑:
for i in range(len(testList)): tokens = testList[i].split() # 循环检查开头的token,直到不匹配为止 while tokens: result = difflib.get_close_matches(tokens[0], jobList, n=1, cutoff=0.85) if result: tokens.pop(0) else: break if tokens: newList.append(' '.join(tokens))
这样就能得到预期的输出,且逻辑清晰,不会出现索引错位问题。
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

