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

Python中使用字典替换字符串列表中的子串问题

字符串批量替换失败问题解决

原始数据

待处理字符串列表

ls = ['BLAH a b c A B C D 12 34 56',
    'BLAH d A B 12 45 78',
    'BLAH a/b A B C 12 45 78',
    'BLAH a/ b A  12 45 78',
    'BLAH a b c A B C D 12 34 99']

替换规则字典

dict2 = {'a b c':'1','d':'2','a/b':'3','a/ b':'4'}

错误尝试

使用以下嵌套列表推导式:

[[ls[i].replace(k,v) for k,v in dict2.items()][0] for i in range(len(ls))]

得到的错误结果:

['BLAH 1 A B C D 12 34 56', 
'BLAH d A B 12 45 78', 
'BLAH a/b A B C 12 45 78', 
'BLAH a/ b A  12 45 78', 
'BLAH 1 A B C D 12 34 99']

期望正确结果

['BLAH 1 A B C D 12 34 56',
    'BLAH 2 A B 12 45 78',
    'BLAH 3 A B C 12 45 78',
    'BLAH 4 A  12 45 78',
    'BLAH 1 A B C D 12 34 99']

错误原因

内层列表推导式会对同一个原始字符串执行所有替换,但你只取了第一个替换后的结果([0]),后续的替换操作全部被丢弃,导致只有字典第一个键值对生效。

正确解法

方法1:循环写法(可读性高)

result = []
for s in ls:
    for k, v in dict2.items():
        s = s.replace(k, v)
    result.append(s)

方法2:列表推导式

result = [s for s in ls for k, v in dict2.items() if (s := s.replace(k, v))]

方法3:使用reduce(简洁)

from functools import reduce

result = [reduce(lambda s, kv: s.replace(*kv), dict2.items(), s) for s in ls]

以上三种方法都能得到符合预期的替换结果。

内容的提问来源于stack exchange,提问作者frank

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 12:23:27