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

如何在Python列表推导式中遵循DRY原则,避免重复调用.lower().strip()

如何在Python列表推导式中遵循DRY原则,避免重复调用.lower().strip()

完全懂这种重复写同一段代码看着闹心的感觉!你已经注意到了DRY(Don't Repeat Yourself)原则,这点特别棒~

先看你原来的问题:原列表推导式里两次调用了.lower().strip(),不仅冗余,要是数据量大的话还会做重复的计算。这里有几个更优雅的解决方案,既能避免重复,又不会让代码变得臃肿:

方案一:用生成器表达式提前处理(可读性最优)

先把所有词做一次lower().strip()处理,用生成器表达式的话还不会额外占用太多内存(惰性求值嘛),然后再过滤收集:

words = r'''
one
TWO
thr33
fo ur
'''

# 先统一处理所有词,每个词只处理一次
processed = (w.lower().strip() for w in words.splitlines())
# 再过滤纯字母的词并收集
result = [word for word in processed if word.isalpha()]

print(result)  # 输出 ['one', 'two']

这个方案把处理逻辑和过滤逻辑分开,代码清晰易懂,完美符合DRY原则。

方案二:嵌套列表推导式(紧凑版)

如果喜欢把代码写成一行,也可以把生成器表达式直接嵌套在列表推导式里,效果和上面一样,但更紧凑:

words = r'''
one
TWO
thr33
fo ur
'''

result = [word for word in (w.lower().strip() for w in words.splitlines()) if word.isalpha()]
print(result)

相比你用map+lambda的版本,这个写法更符合Python的惯用风格,不用额外写lambda,可读性好很多。

小提醒:注意isalpha()和isalnum()的区别

你之前的map方案里用了isalnum(),但原需求是只保留纯字母的词(比如thr33要被过滤,fo ur处理后带空格,isalpha()会返回False,刚好符合原输出),所以这里要记得用isalpha()而不是isalnum(),避免把带数字的词也放进来。

总的来说,上面两种方案都能让你只对每个词做一次lower().strip()处理,既遵循了DRY原则,代码也保持简洁易读~

备注:内容来源于stack exchange,提问作者user3310334

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 12:04:28