如何针对两个列表使用列表推导式?附代码优化需求
用列表推导式重构匹配统计逻辑
原代码里的嵌套循环核心是统计每行中目标单词的出现次数,咱们可以用**列表推导式+sum()**来替代,既简洁又能实现完全一样的逻辑:
重构后的代码
# 替换原嵌套循环部分 login = sum( 1 for bline in lines for word in words if ( (processed_line := return_only_ascii(bline.decode())) != "\n" and processed_line.find(word) != -1 ) )
逻辑说明
- 外层遍历
lines里的每一行bline,内层遍历words里的每个目标单词 - 先把
bline解码成字符串,再转成纯ASCII格式得到processed_line - 如果
processed_line是空行(等于"\n"),直接跳过这一行的单词检查;否则只要单词在该行中存在,就计数1 - 最后用
sum()把所有匹配的次数加起来,直接赋值给login
补充:处理解码异常
如果原文件里有无法解码的字节,原代码会直接报错,咱们可以加个小辅助函数来处理这种情况:
# 先定义辅助解码函数 def safe_decode(bline): try: return bline.decode() except UnicodeDecodeError: return "" # 替换嵌套循环的代码 login = sum( 1 for bline in lines for word in words if ( (processed_line := return_only_ascii(safe_decode(bline))) != "\n" and processed_line.find(word) != -1 ) )
这样既保留了原逻辑的功能,又用更简洁的推导式替代了嵌套循环,运行效率也没差。
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

