如何避免在推导式中添加函数生成的None值且仅调用一次函数
优化字典/列表推导式避免重复调用函数
原字典推导式中,每个符合条件的bar会被两次调用foo(bar),当foo是耗时操作时会影响效率:
my_dict = {bar: foo(bar) for bar in some_range if foo(bar) is not None}
要实现仅调用一次foo(bar),同时不生成含None的中间结构,可以用生成器表达式预计算结果,再过滤并构建目标结构:
字典推导式优化写法
my_dict = {bar: res for bar, res in ((b, foo(b)) for b in some_range) if res is not None}
列表推导式对应优化写法
如果是列表推导式场景,逻辑完全一致:
my_list = [res for bar, res in ((b, foo(b)) for b in some_range) if res is not None]
核心逻辑是:先通过生成器((b, foo(b)) for b in some_range)遍历some_range,每个元素仅调用一次foo并得到(bar, 计算结果)的元组;后续推导式直接使用预计算的结果做判断,符合条件的才加入最终的字典或列表,全程无冗余计算和无效中间结构。
内容的提问来源于stack exchange,提问作者Gadi A
相关产品推荐
相关产品推荐

