给定一些可以返回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]
答案 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
也将被删除。