检查另一个字符串中的单词列表

Max*_*rai 113 python list

我可以在python中做这样的事情:

l = ['one', 'two', 'three']
if 'some word' in l:
   ...
Run Code Online (Sandbox Code Playgroud)

这将检查列表中是否存在"某个单词".但我可以做反向的事情吗?

l = ['one', 'two', 'three']
if l in 'some one long two phrase three':
    ...
Run Code Online (Sandbox Code Playgroud)

我必须检查数组中的某些单词是否在字符串中.我可以使用循环来做这个,但这种方式有更多的代码行.

ken*_*ytm 268

if any(word in 'some one long two phrase three' for word in list_):
Run Code Online (Sandbox Code Playgroud)

  • @Ockonal:如果你想检查**该列表中的所有**单词都在字符串中,只需用`all()替换上面的'any()`. (16认同)
  • 请注意,如果'我'在`list_`中,它将被视为匹配,因为'我'在'some'中.如果你只想匹配整个单词,你需要更改为`any(在一个单词长的两个短语三个'.split()中为单词list_)`中的单词,就像我在答案中创建集合时所做的那样. (16认同)
  • @nlogn:`words = [list中的单词 - 如果'长短语中的单词']`(或使用`filter`). (3认同)

Pau*_*McG 19

如果您的单词列表长度很长,并且您需要多次进行此测试,则可能值得将列表转换为集合并使用集合交集进行测试(附加的好处是您将获得实际的单词在两个列表中):

>>> long_word_list = 'some one long two phrase three about above along after against'
>>> long_word_set = set(long_word_list.split())
>>> set('word along river'.split()) & long_word_set
set(['along'])
Run Code Online (Sandbox Code Playgroud)


Dav*_*rby 15

以下是一些替代方法,可能比KennyTM的答案更快或更合适,具体取决于具体情况.

1)使用正则表达式:

import re
words_re = re.compile("|".join(list_of_words))

if words_re.search('some one long two phrase three'):
   # do logic you want to perform
Run Code Online (Sandbox Code Playgroud)

2)如果你想匹配整个单词,你可以使用集合,例如你不想在短语"他们的定理是理论的"中找到单词"the":

word_set = set(list_of_words)
phrase_set = set('some one long two phrase three'.split())
if word_set.intersection(phrase_set):
    # do stuff
Run Code Online (Sandbox Code Playgroud)

当然,您也可以使用"\ b"标记与正则表达式进行全字匹配.

这些和Kenny解决方案的性能将取决于几个因素,例如单词列表和短语字符串的长度,以及它们更改的频率.如果性能不是问题,那么选择最简单的,可能是肯尼的.

  • 对于与“\b”标记匹配的整个单词: `words_re = re.compile(r"\b" + r"\b|".join(list_of_words)+r"\b")` (2认同)