我一直在努力锻炼几个小时,所以我正在寻求帮助。
我必须重写这个功能:
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
我们刚开始研究高阶函数,所以我设法写了几个但不是这个。
谢谢你的帮助
好的,所以我试着去做@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)
你不需要任何这些。这是一个单行:直接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()
类型。)