求助:基于不等长预期/实际列表创建更新新列表的逻辑修正
问题分析与解决方案
你的核心需求是:对比固定的Expected列表与存在拼写错误、额外元素的Actual列表,将拼写错误的元素替换为Expected中的正确词汇,额外元素标记为missing。当前代码的问题在于仅保留Actual中的元素(即使拼写错误),未实现错误词汇的替换逻辑。
原代码的不足
- 当Actual元素存在拼写错误时,仅通过位置对应元素的单词交集判断,直接保留错误拼写,未替换为Expected中的正确词汇;
- 依赖位置匹配的逻辑不够灵活,无法处理非对应位置的近似匹配场景。
解决方案一:基于编辑距离的精准匹配
使用编辑距离(Levenshtein Distance)衡量字符串相似度,自动替换拼写错误的词汇,标记无法匹配的额外元素。需要先安装python-Levenshtein库:pip install python-Levenshtein
from Levenshtein import distance as lev_distance # 固定的Expected列表 exp = ['change of form','death certificate','authority form', 'payment form','lodgement form','supporting documentation', 'proof of authority','proof of executor','proof of identity', 'reverse form','statutory declaration','agreements', 'transfers','mediators'] # 待处理的Actual列表 act = ['change of form','death certificatey', 'authority form','payment form','lodgement form','supporting documentation', 'proof of authority','proof of executor','proof of identity','proof of ownership', 'reverse form','statutory declaration','agreements','transfers','mediators'] exp_set = set(exp) expected_output = [] for item in act: # 优先处理完全匹配的元素 if item in exp_set: expected_output.append(item) continue # 查找编辑距离最小的Expected元素(阈值可根据需求调整) min_dist = float('inf') best_match = None for exp_item in exp: dist = lev_distance(item, exp_item) if dist < min_dist: min_dist = dist best_match = exp_item # 编辑距离小于等于3时,判定为拼写错误,替换为正确词汇;否则标记为missing if min_dist <= 3: expected_output.append(best_match) else: expected_output.append('missing') print(expected_output)
解决方案二:基于单词重叠率的匹配(无第三方库)
如果不想依赖第三方库,可通过计算单词集合的重叠率来识别拼写错误的元素,实现替换逻辑:
exp = ['change of form','death certificate','authority form', 'payment form','lodgement form','supporting documentation', 'proof of authority','proof of executor','proof of identity', 'reverse form','statutory declaration','agreements', 'transfers','mediators'] act = ['change of form','death certificatey', 'authority form','payment form','lodgement form','supporting documentation', 'proof of authority','proof of executor','proof of identity','proof of ownership', 'reverse form','statutory declaration','agreements','transfers','mediators'] exp_set = set(exp) # 预存每个Expected元素的单词集合,提升匹配效率 exp_word_sets = {item: set(item.split()) for item in exp} expected_output = [] for item in act: if item in exp_set: expected_output.append(item) continue item_words = set(item.split()) max_overlap = 0 best_match = None for exp_item, exp_words in exp_word_sets.items(): overlap_count = len(item_words & exp_words) # 设定重叠率阈值(这里取50%),超过则判定为近似匹配 if overlap_count > max_overlap and overlap_count >= len(exp_words) * 0.5: max_overlap = overlap_count best_match = exp_item if best_match: expected_output.append(best_match) else: expected_output.append('missing') print(expected_output)
两种方案均会输出你期望的结果:
['change of form','death certificate', 'authority form','payment form','lodgement form','supporting documentation', 'proof of authority','proof of executor','proof of identity','missing', 'reverse form','statutory declaration','agreements','transfers','mediators']
内容的提问来源于stack exchange,提问作者KoustubhK
相关产品推荐
相关产品推荐

