如何检查元素是否在具有更高阶函数的集合中

问题描述 投票:0回答:2

我一直在努力锻炼几个小时,所以我正在寻求帮助。

我必须重写这个功能:

def is_in(eq,e,E):
    """ (alpha*alpha -> bool) * alpha * list[alpha] -> bool
    Return True if e is equal to one element of E according to eq"""
    if len(E)==0:
        return False
    elif eq(e,E[0]):
        return True
    else:
        return is_in(eq,e,E[1:])

is_in验证元素是否在集合中(由列表表示)。问题是,两个元素可以是“相同”,但运算符==将返回false(例如,我们认为[0,1]和[1,0]是相同的)

另外,为了制作is_in,我必须使用我之前制作的一个函数:

def exists(L, p):
    """ list[alpha] * (alpha -> bool) -> bool
    Return True if at least one element x of L is such as p(x)==True"""

    for a in L:
        if p(a):
            return True
    return False

我们刚开始研究高阶函数,所以我设法写了几个但不是这个。

谢谢你的帮助

python higher-order-functions membership
2个回答
0
投票

好的,所以我试着去做@chepner告诉我的事情

def is_in(eq, e, E):
    """ (alpha * alpha -> bool) * alpha * list[alpha] -> bool
    Retourne True si e est égal selon eq à un élément de E"""

    if len(E)==0:
        return False
    else:
        def _eq(x):
            for i in E:
                if eq(x, i):
                    return True
            return False
        return exists(E, _eq(e))

你觉得这样对吗?

编辑:好的,我想我有这个解决方案:

def is_in(eq, e, E):
    """ (alpha * alpha -> bool) * alpha * list[alpha] -> bool
    Retourne True si e est égal selon eq à un élément de E"""

    def _eq(x):
        return eq(x, e)
    return exists(E, _eq)

-1
投票

你不需要任何这些。这是一个单行:直接return (e in E)

def is_in(e, E):
    return (e in E)

zoo = ['ant','bat','cat','dog','eel']

>>> is_in('fox', zoo)
False
>>> is_in('cat', zoo)
True
>>> is_in('caterpillar', zoo)
False

不需要递归。无需测试长度为0的角落情况,测试e in E也会处理它并且平凡地返回False。

(顺便说一句,你也可以使用in和集合以及列表.Python有set()类型。)

© www.soinside.com 2019 - 2024. All rights reserved.