以函数作为输出和条件的 Python 列表推导式

Eri*_*lum 5 python list-comprehension list

给定一些可以返回 None 或另一个值的函数以及一个值列表:

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

lst = [1, 2, 3, 4, 5, 6, 7]
Run Code Online (Sandbox Code Playgroud)

我想要一个fn()不返回 None的输出列表

我有一些有效的代码,如下所示:

output = []
for i in lst:
    result = fn(i)
    if result:
        output.append(result)
Run Code Online (Sandbox Code Playgroud)

我可以将其表示为列表理解,如下所示:

output = [fn(i) for i in lst if fn(i)]
Run Code Online (Sandbox Code Playgroud)

但它运行fn(i)任何不返回None两次的东西,如果fn是一个昂贵的函数,这是不可取的。

有没有办法在不运行函数两次的情况下获得很好的pythonic理解?

一个可能的解决方案:

output = [fn(i) for i in lst]
output = [o for o in f if o]
Run Code Online (Sandbox Code Playgroud)

che*_*ner 7

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

 output = [fi for fi in map(fn, lst) if fi is not None]
Run Code Online (Sandbox Code Playgroud)