在python中有条件地在一行中不产生任何内容

时间:2014-11-28 16:22:09

标签: python generator flat

我有像

这样的生成器
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成为生成器的一个项目。 是否有可能在单行中不产生任何东西?

2 个答案:

答案 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]

供参考: