2017-05-04 75 views
3

鉴于一些功能,可以返回None或其他值和值的列表:Python列表理解与函数的输出和条件

def fn(x): 
    if x == 4: 
     return None 
    else return x 

lst = [1, 2, 3, 4, 5, 6, 7] 

我希望有fn()输出列表不返回无

我有一些代码,作品看上去像这样:

output = [] 
for i in lst: 
    result = fn(i) 
    if result: 
     output.append(result) 

我CA ñ表达这种列表理解像这样:

output = [fn(i) for i in lst if fn(i)] 

但它运行fn(i)对于任何不返回None两次这是不可取的,如果fn是一个昂贵的功能。

有没有什么办法可以在没有两次运行的情况下拥有漂亮的pythonic理解?

一个可能的解决方案:

output = [fn(i) for i in lst] 
output = [o for o in f if o] 
+0

你知道什么是Python的?你的for循环。 –

回答

4

你的问题是None是由函数产生的,而不是你正在迭代的东西。尝试

output = [fi for fi in map(fn, lst) if fi is not None] 
+0

这实际上是我正在寻找的答案,这是一种迭代函数结果的方法。谢谢! –

2

只要结合您的解决方案:

[x for x in [fn(i) for i in lst] if x is not None] 

的缺点是,任何None S IN原始列表由fn生产也将被删除。

+2

与None的比较应更改为'x不是None'。 – Darthfett