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

时间:2019-02-24 22:59:57

标签: python higher-order-functions membership

我已经在练习中挣扎了几个小时,所以我正在寻求帮助。

我必须重写此函数:

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

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

感谢您的帮助

2 个答案:

答案 0 :(得分: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 :(得分:-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()类型。)