我在列表理解中使用了一个函数以及一个if函数:
new_list = [f(x) for x in old_list if f(x) !=0]
让我感到烦恼的是,f(x)
表达式在每个循环中被计算两次。
有没有一种更清洁的方法?类似于存储值或将if语句包括在列表推导的开头。
答案 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.有哪些可用