Python中是否有与filter
相反的功能?即将项目保留在回调返回False
的iterable中?无法找到任何东西。
答案 0 :(得分:25)
不,filter()
没有内置的反函数,因为你可以简单地反转测试。只需添加not
:
positive = filter(lambda v: some_test(v), values)
negative = filter(lambda v: not some_test(v), values)
itertools
模块确实有itertools.ifilterfalse()
,这是相当多余的,因为反转布尔测试非常简单。 itertools
版本始终作为生成器运行。
答案 1 :(得分:8)
您可以使用itertools.filterfalse
或Martijn建议执行此操作,将not
放在您在过滤器中使用的lambda中的某个位置。
答案 2 :(得分:5)
另一种选择:
from operator import not_
compose = lambda f, g: lambda x: f( g(x) )
...
ys = filter(compose(not_, predicate), values)
您可以预先提供compose()
的预展版本(例如功能正常或toolz)。
答案 3 :(得分:1)
从Ross Bencina的评论Martijn Pieters' answer:
你的推理不是很有说服力。第一种情况已经可以了 写的
positive = filter(some_test, values)
因此要求的至少应该像
一样简单negative = filter(not(some_test), values)
我建议使用一个简单的否定包装函数:
def _not(func):
def not_func(*args, **kwargs):
return not func(*args, **kwargs)
return not_func
允许写上面的第二行(添加了下划线或其他区别,因为not
运算符不能也可能不应该被覆盖):
negative = filter(_not(some_test), values)
答案 4 :(得分:0)
我也有同样的情况,但是我不想为过滤器添加重复的功能。 这是我的解决方案,可以过滤字典中的项目并能够反转选择。
req_table = {
"ID_4001" : {"R_STAT":True, "V_STAT":False, "TYPE":"X", "VEL": 1},
"ID_0051" : {"R_STAT":True, "V_STAT":True, "TYPE":"X", "VEL": 23},
"ID_0741" : {"R_STAT":True, "V_STAT":False, "TYPE":"Y", "VEL": 32},
"ID_0701" : {"R_STAT":True, "V_STAT":False, "TYPE":"X", "VEL": 2353},
}
def count_prop(prop, with_val, rq_table, invert=False):
return len(list(filter(lambda tc : (tc[1][prop] == with_val)^invert, rq_table.items())))
print("Items of type X: {}".format(count_prop("TYPE", "X", req_table)))
print("Items of type Y: {}".format(count_prop("TYPE", "X", req_table, invert=True)))
诀窍是^
,它充当启用的not
。