【发布时间】:2016-03-15 05:22:11
【问题描述】:
我想把这段代码变成一个列表理解:
l = list()
for i in range(10):
j = fun(i)
if j:
l.append(j)
意味着我只想将真实的fun() 结果值添加到列表中。如果没有对该函数调用的真实检查,列表理解将是:
l = [fun(i) for i in range(10)]
将if fun(i) 添加到列表推导中会导致每次迭代对fun() 进行两次评估(实际上,并非总是如此!),因此如果fun() 不纯,则会导致意外的副作用。
我可以捕获fun(i) 的结果并在相同的理解中使用它,本质上是添加if j 吗? (相关问题here)
【问题讨论】:
-
l = filter(None, map(fun, range(10)))或l = [x for x in (fun(i) for i in range(10)) if x] -
@falsetru:您的第一个语句返回一个可迭代的
filter对象而不是一个列表,而您的第二个语句是一个 filter idiom 成语和一个实际列表。 -
是的,您需要用
list(...)包裹第一个以获取列表。 -
map,filter在 Python 3.x 中惰性操作(返回迭代器)
标签: python-3.x list-comprehension