You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 14:15:11