[英]How to write a list comprehension without repeating the evaluation of a function?
我對這個瑣碎的問題表示歉意,但我找不到解決方案。 我需要創建以下列表:
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]
嗯...非常基本...關於存儲g(i)
和f(i)
結果的變量呢?
代替
for i in x:
if(f(i) < g(i)):
my_list.append(f(i)*g(i))
做類似的事情
for i in x:
a = f(i)
b = g(i)
if a < b:
my_list.append(a*b)
您可以避免使用append
,如下所示:
def func(x):
for i in x:
a = f(i)
b = g(i)
if a < b:
yield a*b
my_list = list(func(x))
考慮
[ fi * gi for fi, gi in zip(map(f, x), map(g, x)) if fi < gi ]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.