Есть ли у Python более чистый способ выразить "если x содержит a|b|c / d..."? [дубликат]


этот вопрос уже есть ответ здесь:

  • Проверьте, содержит ли элемент списка Python строку внутри другой строки 13 ответов

Питонический способ проверить, если строка x подстрока y - это:

if x in y:

найти, если x эквивалентно a,b,c,d, e,f или g тоже весть:

if x in [a,b,c,d,e,f,g]:

но если какая-то строка x содержит a,b,c,d,e,f или g кажется неуклюжим:

if a in x or b in x or c in x or d in x or e in x or f in x or g in x

есть еще весть метод проверки, если строка x содержит элемент списка?

я знаю, что это тривиально написать это сам, используя цикл или используя регулярное выражение:

re.search('(dog|cat|bird|mouse|elephant|pig|cow)', x)

но я был интересно, есть ли более чистый способ, который не включает регулярное выражение.

4 72

4 ответа:

в подходящие для Python подход будет использовать any():

if any(s in x for s in (a,b,c,d,e,f,g)):

из связанной документации:

any( iterable)

возвращает True, если какой-либо элемент iterable - это правда. Если iterable пуст, возвращает False. Эквивалентно:

def any(iterable):
    for element in iterable:
        if element:
            return True
    return False

кроме того, обратите внимание, что я использовал кортеж вместо списка здесь. Если ваш a -g значения предварительно определенный, тогда кортеж действительно будет предпочтительным. Смотрите:являются ли кортежи более эффективными, чем списки в Python?

if any(q in x for q in [a,b,c,d,e,f,g]):

Я думаю, что короткий и обновления, как вы можете сделать это.

немного опоздал на вечеринку, но

not frozenset(x).isdisjoint(frozenset(y))

будет работать, и может быть быстрее (алгоритмически, но не для небольших тестовых случаев).

без использования any, а просто max

def is_in(symbol, lst):
    return max([symbol in x for x in lst]) 

print is_in('a',['ae','br','tl'])
print is_in('c',['ae','br','tl'])

дает

>>> 
True
False