Python列表推导式中,输出为函数且带有条件的写法

7

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

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

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

我希望得到一个不返回None的fn()输出列表

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

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

我可以使用列表推导式来表达这个意思,如下所示:
output = [fn(i) for i in lst if fn(i)]

但是它对于那些不返回None两次的所有内容都运行fn(i),如果fn是一个昂贵的函数,则这是不可取的。

是否有任何方法可以在不运行两次函数的情况下使用漂亮的Python推导?

一种可能的解决方案:

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

你知道什么是Pythonic吗?你的for循环。 - juanpa.arrivillaga
2个回答

9
你的问题是函数返回了None,而不是你正在迭代的对象。试试这样做:
 output = [fi for fi in map(fn, lst) if fi is not None]

这基本上就是我要找的答案,一种迭代函数结果的方法。谢谢! - Eric Blum

3

只需要将您的解决方案组合起来:

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

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


2
将与 None 的比较更改为 x is not None - Casey Kuball

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接