Список членства в Python без "в" - PullRequest
3 голосов
/ 24 октября 2010

Как определить функцию is_member (), которая принимает значение (то есть число, строку и т. Д.) X и список значений a, и возвращает True, если x является членом a, в противном случае - False.(Обратите внимание, что это именно то, что делает оператор in, но ради упражнения я должен сделать вид, что у Python не было этого оператора.

Это то, что я придумал, но это не такработа!

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

Ответы [ 6 ]

4 голосов
/ 24 октября 2010

Я могу придумать два ( изменить: три) способа сделать это:

Во-первых:

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
3 голосов
/ 24 октября 2010

Рекурсивное решение:

def is_member(value, array):
    if len(array) == 0:
        return False
    return value == array[0] or is_member(value, array[1:])
2 голосов
/ 24 октября 2010

Использование выражения генератора (обратите внимание, что этот оператор in не имеет ничего общего с другим)

def is_member(x, a):
   return any(x == y for y in a)

>>> is_member(10, xrange(1000000000000000))
True
1 голос
/ 24 октября 2010

Без использования оператора «in»:

from itertools import imap
def is_member( item, array ):
    return any( imap(lambda x: x == item, array ) )

, который будет циклически проходить по элементам списка, по одному, и короткого замыкания при достижении значения, равного True.

1 голос
/ 24 октября 2010

Вы можете просто перебрать каждый элемент списка:

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
0 голосов
/ 25 октября 2010

Ну, конечно, есть много способов сделать это, но вас немного затрудняет запрет "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]

Дайте нам знать, как это происходит.

...