是否有一个与内置相对的过滤器()?

Avi*_*ohn 13 python functional-programming

Python中的函数是否与其相反filter?即将项目保留在回调返回的iterable中False?找不到任何东西.

Mar*_*ers 25

不,没有内置的反函数filter(),因为你可以简单地反转测试.只需添加not:

positive = filter(lambda v: some_test(v), values)
negative = filter(lambda v: not some_test(v), values)
Run Code Online (Sandbox Code Playgroud)

itertools模块确实具有itertools.ifilterfalse()相当多余的功能,因为反转布尔测试非常简单.该itertools版本始终作为生成器运行.

  • 你的推理不是很有说服力.第一种情况可以写成`positive = filter(some_test,values)`因此要求的应该至少与`negative = filter(not(some_test),values)一样简单. (7认同)
  • 小心!“not”是 python 中的内置函数,它立即计算为“True”或“False”。函数对象的计算结果为“False”,并且过滤器需要一个函数,因此这会给您一个 TypeError,因为第一个参数是布尔值。其他读者要小心。 (4认同)
  • @Multihunter:或者你在问罗斯的评论?他们希望有*是*not()`函数或其他一些可能的符号来反转函数对象的结果,所以他们不必使用lambda.他们并没有声称这个表达今天有效,他们抱怨它*不起作用. (2认同)

El'*_*man 8

您可以使用itertools.filterfalse或者像Martijn建议的那样,not在您在过滤器中使用的lambda中放置一个位置.


Nic*_*ens 6

Ross Bencina的评论到Martijn Pieters回答

你的推理不太有说服力。第一种情况已经可以写了

positive = filter(some_test, values)
Run Code Online (Sandbox Code Playgroud)

因此所要求的至少应该是简单的

negative = filter(not(some_test), values)
Run Code Online (Sandbox Code Playgroud)

我建议使用一个简单的否定包装函数:

def _not(func):
    def not_func(*args, **kwargs):
        return not func(*args, **kwargs)
    return not_func
Run Code Online (Sandbox Code Playgroud)

允许按上面的方式编写第二行(添加下划线或其他区别,因为not运算符不能而且可能不应该被覆盖):

negative = filter(_not(some_test), values)
Run Code Online (Sandbox Code Playgroud)


Ros*_*ina 5

另外一个选项:

from operator import not_
compose = lambda f, g: lambda x: f( g(x) )

...

ys = filter(compose(not_, predicate), values)
Run Code Online (Sandbox Code Playgroud)

您可以预先compose()提供可用的版本(例如,在功能或工具中).