能否使用列表推导式实现指定字符串的批量替换操作?
当然可行!一行实现的两种方案
你的需求是把列表里每个字符串中的指定词汇全部删掉,原来的写法是循环每个要移除的词,每次都重新生成整个列表。我们可以把这个逻辑压缩到一行里,这里给你两种实用的思路:
方案1:用functools.reduce(简洁又易读)
reduce这个工具能帮我们把多次替换操作“攒”到每个字符串上,只需要先导入functools模块就行:
from functools import reduce a = ['test', 'smth'] b = ['test Lorem ipsum dolor sit amet', 'consectetur adipiscing elit', 'test Nulla lectus ligula', 'imperdiet at porttitor quis', 'smth commodo eget tortor', 'Orci varius natoque penatibus et magnis dis parturient montes'] # 一行搞定所有替换 b = [reduce(lambda current_text, word_to_remove: current_text.replace(word_to_remove, ''), a, original_text) for original_text in b]
简单说下逻辑:对b里的每一句original_text,我们用reduce依次把a中的每个word_to_remove替换成空字符串,最后把处理好的句子重新组成新列表。
方案2:纯嵌套写法(不用额外模块)
要是你不想导入模块,也可以用Python 3.8+支持的赋值表达式来实现纯一行的嵌套处理:
a = ['test', 'smth'] b = ['test Lorem ipsum dolor sit amet', 'consectetur adipiscing elit', 'test Nulla lectus ligula', 'imperdiet at porttitor quis', 'smth commodo eget tortor', 'Orci varius natoque penatibus et magnis dis parturient montes'] # 一行实现,利用赋值表达式累积替换结果 b = [final_text for original in b for final_text in [original] if not any(final_text := final_text.replace(word, '') for word in a)]
这里的:=会每次替换后更新final_text的值,直到把a里的所有词汇都处理完。要是你的Python版本低于3.8,其实还是推荐第一种方案,毕竟可读性更强。
两种方案跑出来的结果和你原来的代码完全一致,处理后的b会是:
[' Lorem ipsum dolor sit amet', 'consectetur adipiscing elit', ' Nulla lectus ligula', 'imperdiet at porttitor quis', ' commodo eget tortor', 'Orci varius natoque penatibus et magnis dis parturient montes']
内容的提问来源于stack exchange,提问作者Mikhail_Sam
相关产品推荐
相关产品推荐

