您需要生成器理解而不是此处的列表。
例如,
l = [1, 4, 6, 7, 30, 2]
def my_condition(x):
return x > 5 and x < 20
print sum(1 for x in l if my_condition(x))
# -> 2
print sum(1 for x in range(1000000) if my_condition(x))
# -> 14
或者使用itertools.imap
(尽管我认为显式列表和生成器表达式看起来更像 Pythonic)。
请注意,尽管从sum
示例中并不明显,但您可以很好地编写生成器推导。例如,
inputs = xrange(1000000) # In Python 3 and above, use range instead of xrange
odds = (x for x in inputs if x % 2) # Pick odd numbers
sq_inc = (x**2 + 1 for x in odds) # Square and add one
print sum(x/2 for x in sq_inc) # Actually evaluate each one
# -> 83333333333500000
这种技术很酷的一点是,您可以在代码中指定概念上单独的步骤,而无需强制评估和存储在内存中,直到评估最终结果。