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

标签 python list-comprehension

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

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/

相关文章:

python - Python 中意外的列表理解行为

python - 将嵌套列表的字典转换为元组列表

python - 处理同名类、模块和包的 Pythonic 方式是什么?

javascript - selenium phantomjs 无法抓取网站机器人检测

python - 检查字符串列表中的子字符串,不区分大小写

python - 如何构建动态增长的嵌套列表理解?

python - 识别特定字符串并将其放置在同一索引中

python - 人脸识别opencv有类型元组错误

python - 优化 python for 循环

python - Python 中等效的 Unix Source 命令