当然,以下两项之间的区别:[f(x) for x in list]
而这个:(f(x) for x in list)
第一个将在内存中生成列表,而第二个是一个新的生成器,具有延迟计算。
因此,只需将“未筛选”列表作为生成器编写即可。这是您的代码,其中包含生成器:def myFunction(x):
print("called for: " + str(x))
return x * x
originalList = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
limit = 10
result = [C2 for C2 in ((myFunction(C), C) for C in originalList) if C2[0] < limit]
# result = [C2 for C2 in [(myFunction(C), C) for C in originalList] if C2[0] < limit]
请注意,您将不会看到打印输出与两者之间的差异,但如果您要查看内存使用情况,则注释掉的第二条语句将使用更多内存。
要对问题中的代码进行简单更改,请按以下方式重写未筛选的代码:unfiltered = [ (myFunction(C),C) for C in originalList ]
^ ^
+---------- change these to (..) ---------+
|
v
unfiltered = ( (myFunction(C),C) for C in originalList )