如何定义一个函数is_member(),它接受一个值(即一个数字,字符串等)x和一个值列表a,如果x是一个成员,则返回True,否则返回False。 (请注意,这正是in运算符所做的,但为了练习,我应该假装Python没有这个运算符。
这是我提出的,但它不起作用!
def is_member(x, a):
return x == a[::]
答案 0 :(得分:4)
我可以想到两个(编辑:三种)方法:
首先:
def is_member(array, value):
try:
array.index(value)
except ValueError:
return False
else:
return True
第二
def is_member(array, value):
for item in array:
if item == value:
return True
return False
编辑:此外,第三名:
def is_member(array, value):
return array.count(value) > 0
答案 1 :(得分:3)
递归解决方案:
def is_member(value, array):
if len(array) == 0:
return False
return value == array[0] or is_member(value, array[1:])
答案 2 :(得分:2)
使用生成器表达式(请注意,此in
运算符与另一个运算符无关)
def is_member(x, a):
return any(x == y for y in a)
>>> is_member(10, xrange(1000000000000000))
True
答案 3 :(得分:1)
您可以简单地遍历列表中的每个元素:
def is_member(col, a):
for i in xrange(len(col)):
if a == col[i]: return True
return False
>> a = [1,2,3,4]
>> is_member(a, 2)
True
>> is_member(a, 5)
False
答案 4 :(得分:1)
不使用“in”运算符:
from itertools import imap
def is_member( item, array ):
return any( imap(lambda x: x == item, array ) )
将循环遍历列表中的项目,一次一个,并且当它达到True
的值时短路。
答案 5 :(得分:0)
当然,有很多方法可以做到这一点 - 但是由于禁止在代码中的任何地方使用“in”,你会有点麻烦。这里有几件事要尝试。
主题的变化......
def is_member(item, seq):
return sum(map(lambda x: x == item, seq)) > 0
def is_member(item, seq):
return len(filter(lambda x: x != item, seq)) != len(seq)
你可能听说要求宽恕比要求许可更好......
def is_member(item, seq):
try:
seq.index(item)
return True
except:
return False
或者更具功能性的东西......
import itertools, operator, functools
def is_member(item, seq):
not_eq = functools.partial(operator.ne, item)
return bool(list(itertools.dropwhile(not_eq, seq)))
但是,由于您的要求排除了使用最合理的循环结构,我认为专家会建议您编写自己的循环框架。有点像...
def loop(action, until):
while True:
action()
if until():
break
def is_member(item, seq):
seq = seq
sigil = [False]
def check():
if seq[0] == item:
sigil[0] = True
def til():
seq.remove(seq[0])
return not len(seq)
loop(check, til)
return sigil[0]
让我们知道它是怎么回事。