对于这个微不足道的问题,我深表歉意,但我找不到解决方案。我需要创建以下列表:
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]
关于python - 如何在不重复函数评估的情况下编写列表理解?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40351374/