避免在列表理解中两次计算相同的表达式

时间:2019-07-10 09:14:33

标签: python python-3.x list-comprehension

我在列表理解中使用了一个函数以及一个if函数:

new_list = [f(x) for x in old_list if f(x) !=0]

让我感到烦恼的是,f(x)表达式在每个循环中被计算两次。

有没有一种更清洁的方法?类似于存储值或将if语句包括在列表推导的开头。

4 个答案:

答案 0 :(得分:4)

事先计算结果并对其进行迭代

new_list = [x for x in map(f, old_list) if x !=0]

此外,由于map会在访问元素时计算每个元素的结果,因此这只是一个循环。

答案 1 :(得分:4)

您可以在列表理解中使用生成器表达式(以避免创建不必要的列表):

new_list = [fx for fx in (f(x) for x in old_list) if fx != 0]

从python 3.8开始,您将可以执行this

new_list = [fx for x in old_list if (fx := f(x)) != 0]

答案 2 :(得分:2)

在Python 3.8中,我们将拥有"walrus operator"并且能够做到这一点!

[y for x in old_list if (y := f(x)) != 0]

答案 3 :(得分:1)

您可以使用filter删除结果:

def f (x):
  return x * 2

old_list = [0, 1, 2, 3]

new_list = filter(lambda x: x != 0, [f(x) for x in old_list])

for x in new_list:
  print(x)

看到它正常工作here.

或者,您可以记住该函数,以防止两次不得不计算相同的结果:

def f (x):
  return x * 2

def memoize(f):
    memo = {}
    def helper(x):
        if x not in memo:
            print("Computing result for %s" % x)        
            memo[x] = f(x)
        return memo[x]
    return helper

memF = memoize(f)

old_list = [0, 1, 2, 3]

new_list = [memF(x) for x in old_list if memF(x) != 0]

for x in new_list:
  print(x)

here.有哪些可用