我有像
这样的生成器def not_nones(some_iterable):
for item in some_iterable:
if item is not None:
yield item
但由于" flat比嵌套"更好,我想在一行中执行此操作,例如:
def not_nones(some_iterable):
for item in some_iterable:
yield item if item is not None else None
但这实际上会使None
成为生成器的一个项目。
是否有可能在单行中不产生任何东西?
答案 0 :(得分:6)
你可以只返回一个生成器表达式:
def not_nones(iterable):
return (item for item in iterable if item is not None)
或真正的单行:
not_nones = lambda it: (i for i in it if i is not None)
此时正在进入代码高尔夫领域。
但实际上,您当前的代码没有太大问题;它以合理的方式做它需要做的事情。你的代码就是我在这种情况下所写的代码。
答案 1 :(得分:1)
您可以使用itertools.ifilter()
。给定正确的谓词函数,它提供了您在此处实现的功能。
示例:
import itertools
# make up data
l = [1, None, 2, None, 3]
# predicate function
not_none = lambda x: x is not None
# filter out None values
not_nones = itertools.ifilter(not_none, l)
print list(not_nones) # prints [1, 2, 3]
供参考: