7

有没有办法在列表(或字典)理解中测试函数的返回?我想避免这样写:

lst = []
for x in range(10):
  bar = foo(x)
  if bar:
    lst.append(bar)

并改用列表推导。显然,我不想写:

[foo(x) for x in range(10) if foo(x)]

所以?

[foo(x) for x in range(10) if ??? ]
4

2 回答 2

10

怎么样

filter(None, map(foo, range(10)))

如果您不想保留中间列表,请替换map()itertools.imap(). 有了itertools.ifilter(),整个东西可以变成一个发电机。

itertools.ifilter(None, itertools.imap(foo, range(10)))
于 2012-11-29T18:28:52.670 回答
5

只需制作一个生成器来计算值,然后从生成器构建过滤列表。

例子:

# create generator via generator expression
results = (foo(x) for x in xrange(10))
# build result list, not including falsy values
filtered_results = [i for i in results if i]

以供参考:

于 2012-11-29T18:31:44.317 回答