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
相关产品推荐
相关产品推荐

