簡體   English   中英

如何在不重復函數求值的情況下編寫列表理解?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM