在没有“in”的Python中列出成员身份

时间:2010-10-24 13:20:58

标签: python membership

如何定义一个函数is_member(),它接受一个值(即一个数字,字符串等)x和一个值列表a,如果x是一个成员,则返回True,否则返回False。 (请注意,这正是in运算符所做的,但为了练习,我应该假装Python没有这个运算符。

这是我提出的,但它不起作用!

def is_member(x, a):
   return x == a[::]

6 个答案:

答案 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]

让我们知道它是怎么回事。