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

