Обратите внимание, это не дубликат этого вопроса:

Как проверить, содержит ли строка элемент из списка в Python

Тем не менее, это основано на его логике.

У меня есть такая строка:

my_string = 'this is my complex description'

У меня есть список ключевых слов:

keywords = ['my', 'desc', 'complex']

Я знаю, что могу использовать следующее, чтобы проверить, существуют ли ключевые слова:

if any(ext in my_string for ext in keywords):
    print(my_string)

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

Неважно, какая версия Python является решением.

1
CodeLikeBeaker 18 Дек 2015 в 00:54

3 ответа

Лучший ответ

Если вы хотите сопоставить полные слова, вы можете использовать набор пересечения:

>>> my_string = 'this is my complex description'
>>> keywords = ['my', 'desc', 'complex']
>>> set(my_string.split()) & set(keywords)
{'complex', 'my'}
4
Eugene Yarmash 17 Дек 2015 в 21:57
found_words = [ word for word in keywords if word in my_string ]

Это даст вам список ключевых слов, которые находятся в my_string. Производительность будет лучше, если вы сделаете ключевые слова set, хотя:

keywords = set(['my', 'desc', 'complex'])
found_words = [ word for word in my_string.split() if word in keywords ]

Но последний опирается на тот факт, что my_string не разделяет слова ни с чем, кроме пробелов.

1
Chad S. 17 Дек 2015 в 21:58
>>> my_string = 'this is my complex description'
>>> keywords = ['my', 'desc', 'complex']
>>> print(*[c for c in my_string.split() if c in keywords])
my complex

Обратите внимание, что это работает, насколько мне известно, только на python3.x (я не слишком уверен, как это будет в Python 2)

Если вы не уверены в том, что он делает, * просто распаковывает список, созданный из списка, который фильтрует любой элемент, который НЕ является my_string, в качестве отдельных аргументов в print. В python3 отдельные аргументы в print печатаются с пробелами между ними.

1
R Nar 17 Дек 2015 в 21:57