2013-05-05 3 views
22

Я уже нашел ответы на этот вопрос, но они, похоже, устарели для текущих версий Python (или, по крайней мере, они не работают для меня).Проверьте, находится ли подстрока в списке строк?

Я хочу проверить, содержится ли подстрока в списке строк. Мне нужен только логический результат.

Я нашел это решение:

word_to_check = 'or' 
wordlist = ['yellow','orange','red'] 

result = any(word_to_check in word for word in worldlist) 

Из этого кода я бы ожидать, чтобы получить значение True. Если слово было «der», то выход должен быть False.

Однако результат - это функция генератора, и я не могу найти способ получить значение True.

Любая идея?

+3

код, который вы опубликовано отлично (за исключением 'wordlist' /' worldlist'). Я предполагаю, что вы забыли вызов 'any()', когда вы его пробовали раньше. –

+0

Я пропустил, что вы уже использовали 'any'. –

+0

Взглянув на ваш код и комментарии, я думаю, что проблема - это «любая» функция, которую я использую. Вероятно, это любая функция в модуле numpy. Таким образом, решение будет заключаться в использовании встроенной функции, но любая идея о том, как это сделать после того, как был импортирован модуль numpy? –

ответ

20

Вы можете импортировать any из __builtin__ в случае он был заменен каким-либо другим any:

>>> from __builtin__ import any as b_any 
>>> lst = ['yellow', 'orange', 'red'] 
>>> word = "or" 
>>> b_any(word in x for x in lst) 
True 

Обратите внимание, что в Python 3 __builtin__ был переименован в builtins.

+2

Вы можете обойти проблему с помощью 'numpy.any', если вместо генератора используется список comp:' np.any ([word in x for x in lis]) '. –

+1

@MarkTolonen 'np.any' будет медленным, поскольку сначала генерирует весь список. –

+0

Относительно медленнее Да, заметно медленнее ... только ОП может сказать, но не для его примера :) –

4

Вы можете использовать next вместо:

colors = ['yellow', 'orange', 'red'] 
search = "or" 

result = next((True for color in colors if search in color), False) 

print(result) # True 

Чтобы показать строку, содержащую подстроку:

colors = ['yellow', 'orange', 'red'] 
search = "or" 

result = [color for color in colors if search in color] 

print(result) # Orange 
+1

Это похоже на отличный способ найти объекты с подстрокой и может также использоваться для проверки цели True/False длина результирующего массива. –

18

код вы Написал, используя любой() является правильным и не должен работать, если вам он где-то переопределил его.

Тем не менее, существует простое и быстрое решение, которое будет иметься, используя поиск подстроки на одной объединенной строки:

>>> wordlist = ['yellow','orange','red'] 
>>> combined = '\t'.join(wordlist) 

>>> 'or' in combined 
True 
>>> 'der' in combined 
False 

Это должно работать гораздо быстрее, чем подход с использованием любой. Символом объединения может быть любой символ, который не встречается в одном из слов в списке слов.

+2

+1 для наиболее читаемого решения на мой взгляд – starbeamrainbowlabs

+1

Это, на мой взгляд, самое полезное и простое решение. Он также может быть сокращен до одной строки: '' или 'in' \ t'.join (wordlist) ' – mjp

0

Кроме того, если кто-то хочет, чтобы проверить, если какой-либо из значений словаря существует в виде подстроки в списке строк, можно использовать следующее:

list_a = [ 
    'Copy of snap-009ecf9feb43d902b from us-west-2', 
    'Copy of snap-0fe999422014504b6 from us-west-2', 
    'Copy of snap-0fe999422014cscx504b6 from us-west-2', 
    'Copy of snap-0fe999422sdad014504b6 from us-west-2' 
] 
dict_b = { 
    '/dev/xvda': 'snap-0fe999422014504b6', 
    '/dev/xvdsdsa': 'snap-sdvcsdvsdvs' 
} 

for b1 in dict_b.itervalues(): 
    result = next(("found" for a1 in a if b1 in a1), "not found") 
    print result 

Он печатает

not found 
found 
Смежные вопросы