如何在Python推导式中定义嵌套变量并复用以避免重复计算?
问题:Python列表推导式中能否定义嵌套变量复用?
我手上有上千个带HTML格式的备注文件,部分文件开头有空格、单词间有多余空格,还需要排除某一段特定的备注内容。我已经写了strip_tags()函数用来移除HTML标签,目前用两步列表推导式实现需求:
stripped_remarks = [" ".join(strip_tags(rem).split()) for rem in remarks] # 移除多余空格和HTML标签 stripped_remarks = [rem for rem in remarks if rem != r'garbage text ***'] # 从列表中移除垃圾备注
如果合并成一步推导式,就得在条件判断里重复执行处理操作,会造成重复计算。我想在推导式里定义strip_rem变量并复用,写法如下:
stripped_remarks = [" ".join(strip_tags(rem).split()) as strip_rem for rem in remarks if split_rem != r'garbage text ***']
请问这种在Python推导式内定义嵌套变量并复用的方式是否可行?
回答
你写的这种as语法在Python列表推导式里是不可行的,Python的列表推导式不支持这种直接在推导式里定义临时变量并复用的写法。
不过有几种替代方案可以实现“只处理一次,复用结果”的需求:
用生成器表达式先处理再过滤
先通过生成器表达式完成HTML标签移除和空格清理,再基于这个生成器做过滤,每个元素只处理一次,而且生成器是惰性求值,处理上千个文件也不会有内存压力:processed = (" ".join(strip_tags(rem).split()) for rem in remarks) stripped_remarks = [rem for rem in processed if rem != r'garbage text ***']推导式内嵌套单元素循环(技巧写法)
通过嵌套一个只循环一次的临时变量来复用处理结果,本质是利用循环赋值的逻辑:stripped_remarks = [ strip_rem for rem in remarks for strip_rem in [" ".join(strip_tags(rem).split())] if strip_rem != r'garbage text ***' ]用
map封装处理逻辑
把处理逻辑封装成单独函数,再用map批量处理后过滤,代码可读性更好:def process_remark(rem): return " ".join(strip_tags(rem).split()) stripped_remarks = [rem for rem in map(process_remark, remarks) if rem != r'garbage text ***']
另外提一句:你原来的两步推导式有个小bug——第二步过滤用的是原始的remarks列表,而不是第一步处理后的stripped_remarks,这会导致过滤的是未处理的原始内容,得改成[rem for rem in stripped_remarks if rem != ...]才正确。
内容的提问来源于stack exchange,提问作者PVT Compyle
相关产品推荐
相关产品推荐

