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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 18:39:35