Python实现列表连续匹配元素替换为另一列表单个值
实现方案
核心思路是优先匹配最长的疾病名称,避免短词提前截断长匹配,用切片对比减少逐词判断的冗余逻辑,实现代码如下:
def insert_disease_tokens(article_list, disease_list): # 预处理疾病规则:按疾病包含的单词数降序排列,长词优先匹配 disease_rules = [] for disease in disease_list: tokens = tuple(disease.split()) disease_rules.append( (len(tokens), tokens, disease) ) disease_rules.sort(reverse=True, key=lambda x: x[0]) res = [] idx = 0 list_len = len(article_list) while idx < list_len: match_success = False # 逐个尝试匹配疾病规则 for token_cnt, pattern, disease_name in disease_rules: # 剩余单词数不足直接跳过 if idx + token_cnt > list_len: continue # 切片对比连续单词,匹配成功则跳过对应长度 if tuple(article_list[idx:idx+token_cnt]) == pattern: res.append(disease_name) idx += token_cnt match_success = True break # 无匹配则保留原单词 if not match_success: res.append(article_list[idx]) idx += 1 return res
逻辑说明
- 长词优先匹配的规则可以覆盖疾病名嵌套场景,比如同时存在「lithium carbonate toxicity」和「toxicity」时,不会因为先匹配到短词导致长疾病名被拆分
- 直接用列表切片做元组对比,底层是C实现的批量比较,比手动逐词拼接、逐字符判断的性能高很多,适合长文本处理
- 整个流程仅对分词列表做一次线性遍历,没有多余的嵌套循环操作,逻辑简洁易维护
用题目给出的示例测试,输出完全符合预期:
article_list = ['Tricuspid', 'valve', 'regurgitation', 'and', 'lithium', 'carbonate', 'toxicity', 'in', 'a', 'newborn', 'infant', '.'] disease_list = ['Tricuspid valve regurgitation', 'lithium carbonate', 'toxicity'] print(insert_disease_tokens(article_list, disease_list)) # 输出:['Tricuspid valve regurgitation', 'and', 'lithium carbonate', 'toxicity', 'in', 'a', 'newborn', 'infant', '.']
内容的提问来源于stack exchange,提问作者Oweys
相关产品推荐
相关产品推荐

