首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在python中使用多个谓词调用ifilter的简明方法

在python中使用多个谓词调用ifilter的简明方法
EN

Stack Overflow用户
提问于 2010-06-29 23:01:02
回答 3查看 969关注 0票数 3

我正在通过一个脚本流式传输一个非常大的集合,并且当前在一个简单的调用中使用ifilter来拒绝某些值,例如:

代码语言:javascript
复制
ifilter(lambda x: x in accept_list, read_records(filename))

这是一个谓词,但现在我想我应该添加另一个谓词,而且我可能想在将来添加其他谓词。最简单的方法是嵌套一个ifilter调用:

代码语言:javascript
复制
ifilter(lambda x : x not in block_list,
    ifilter(lambda x: x in accept_list, read_records(filename)))

我正在考虑简单地将谓词作为未绑定的函数放在列表中,并将它们用于此目的。然而,这些重复的ifilter调用似乎很难在那里实现(而且可能不是最佳选择)。也许我可以构造一个调用所有谓词的函数,但是我如何写得尽可能简洁(同时仍然可读)呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-06-30 09:13:27

您可以编写以下函数:

代码语言:javascript
复制
def conjoin(*fns):
    def conjoined(x):
        for fn in fns:
            if not fn(x): return False
        return True
    return conjoined

然后,您可以这样命名它:

代码语言:javascript
复制
ifilter(conjoined(lambda x: x not in block_list, lambda x: x in accept_list),
        read_records(filename))

你可以一起实现一个类似的disjoin函数来实现或-ing函数:

代码语言:javascript
复制
def disjoin(*fns):
    def disjoined(x):
        for fn in fns:
            if fn(x): return True
        return False
    return disjoined

可能有一种更好的方法来实现它们,但必须小心。可以尝试将每个函数应用于x并使用allany,但这是不可取的,因为使用它们将需要计算参数上的每个谓词。这里提出的解决方案是令人满意的短路。

另外,为了好玩,让我们实现一个invert函数

代码语言:javascript
复制
def invert(fn):
    return lambda x: not fn(x)

现在,我们有了一组处理函数的functionally complete函数,并且可以构造这些函数的任何逻辑操作:)

票数 5
EN

Stack Overflow用户

发布于 2010-06-29 23:10:28

我将坚持以下解决方案:

代码语言:javascript
复制
def complex_predicate(x):
    return x not in block_list and x in accept_list and is_good(x)

代码语言:javascript
复制
def complex_predicate2(x):
    return all([x not in block_list, x in accept_list, is_good(x)])

然后

代码语言:javascript
复制
ifilter(complex_predicate, read_records(filename))

或者complex_predicate2也是如此。

但是,我认为这是一个品味的问题。

票数 1
EN

Stack Overflow用户

发布于 2011-08-17 20:31:00

如果只有两个谓词,我会想出以下几个:

代码语言:javascript
复制
ifilter(lambda x: x in accept_list and x not in block_list, read_records(filename))

此外,正如上面提到的,如果有两个以上的谓词,最好将所有谓词放在特定函数中。使用all使条件块变得不那么凌乱(因为在本例中,所有谓词都用逗号分隔)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3141958

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档