对于这个微不足道的问题,我深表歉意,但我找不到解决方案。我需要创建以下列表:
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]
