Skip to main content
 首页 » 编程设计

python之如何在不重复函数评估的情况下编写列表理解

2025年05月04日15xiaohuochai

对于这个微不足道的问题,我深表歉意,但我找不到解决方案。我需要创建以下列表:

for i in x: 
    if(f(i) < g(i)): 
         my_list.append(f(i)*g(i)) 

但我不知道如何在不重复函数 f() 和 g() 的计算的情况下用列表推导来做到这一点。我想避免它,因为它们在计算上很昂贵。所以我不想要这样的东西:

[f(i)*g(i) for i in x if f(i) < g(i)] 

因为 f(i) 和 g(i) 在每次迭代中计算两次。我想知道是否有一种方法可以在某处“存储”数字 f(i) 和 g(i) 并在列表理解中调用它们。

请您参考如下方法:

如果您创建一个只有 一个 元素的可迭代对象(如元组或列表),您可以将调用的值存储在 for 循环目标中;一个元素将是一个元组,其中 (f(i), g(i)) 结果在这里:

res = [fi * gi for i in x for fi, gi in [(f(i), g(i))] if fi < gi] 

然而,这不漂亮而且可读性不强。

你最好为此使用一个实际的 for 循环:

res = [] 
for i in x: 
    fi, gi = f(i), g(i) 
    if fi < gi: 
        res.append(fi * gi) 

另一种选择是生成一个中间生成器表达式来计算 f(i) 和 g(i),然后在列表理解中使用输出:

intermediate = ((f(i), g(i)) for i in x) 
res = [fi * gi for fi, gi in intermediate if fi < gi]