Python列表理解用函数作为输出和条件

时间:2017-05-04 16:39:40

标签: python list list-comprehension

给定一些可以返回None或其他值和值列表的函数:

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)

我可以表达这样的列表理解:

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]

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:3)

只需合并您的解决方案:

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

缺点是None生成的原始列表中 中的任何fn也将被删除。