在一个字符串中只找到多个列表中的一个单词
find only one word of multiple lists in a string
from itertools import product
ttext = 'hello how are you?'
list1 = ['abra', 'hello', 'cfre']
list2 = ['dacc', 'ex', 'you', 'fboaf']
list3 = ['ihhio', 'oih', 'oihoihoo']
l = [list1, list2, list3]
所以我有上面的列表,我需要知道文本中是否只有一个单词(只有一个)
我想要的:例如,如果在文本文本中我有 "hello my name is brian",它会说“好的,只有一个词”,但如果我在文本文本中的列表中有多个词,那么 'error'...
这里检查是否所有的单词都在文本中,我该如何检查所有列表中是否只有一个单词在文本中
for words in product(*l):
print(words, all(word in ttext for word in words))
(('abra', 'dacc', 'ihhio'), False)
(('abra', 'dacc', 'oih'), False)
(('abra', 'dacc', 'oihoihoo'), False)
(('abra', 'ex', 'ihhio'), False)
(('abra', 'ex', 'oih'), False)
(('abra', 'ex', 'oihoihoo'), False)
(('abra', 'you', 'ihhio'), False)
(('abra', 'you', 'oih'), False)
(('abra', 'you', 'oihoihoo'), False)
(('abra', 'fboaf', 'ihhio'), False)
(('abra', 'fboaf', 'oih'), False)
(('abra', 'fboaf', 'oihoihoo'), False)
(('hello', 'dacc', 'ihhio'), False)
(('hello', 'dacc', 'oih'), False)
(('hello', 'dacc', 'oihoihoo'), False)
(('hello', 'ex', 'ihhio'), False)
(('hello', 'ex', 'oih'), False)
(('hello', 'ex', 'oihoihoo'), False)
(('hello', 'you', 'ihhio'), False)
(('hello', 'you', 'oih'), False)
(('hello', 'you', 'oihoihoo'), False)
(('hello', 'fboaf', 'ihhio'), False)
(('hello', 'fboaf', 'oih'), False)
(('hello', 'fboaf', 'oihoihoo'), False)
(('cfre', 'dacc', 'ihhio'), False)
(('cfre', 'dacc', 'oih'), False)
(('cfre', 'dacc', 'oihoihoo'), False)
(('cfre', 'ex', 'ihhio'), False)
(('cfre', 'ex', 'oih'), False)
(('cfre', 'ex', 'oihoihoo'), False)
(('cfre', 'you', 'ihhio'), False)
(('cfre', 'you', 'oih'), False)
(('cfre', 'you', 'oihoihoo'), False)
(('cfre', 'fboaf', 'ihhio'), False)
(('cfre', 'fboaf', 'oih'), False)
(('cfre', 'fboaf', 'oihoihoo'), False)
编辑:
如果列表中只有一个单词在文本中:if ttext = 'hello my name is brian' then 'ok there's only one word of the lists that is in ttext'
但是如果我有 'hello how are you' 我有 'hello' 和 'you' 所以 'not ok two word of the lists are in ttext'
不确定你想在这里实现什么,但你可以尝试这样的事情:
for words in product(*l):
print(words, len(word for word in words if word in ttext) == 1)
for list in l:
if 'hello' in list:
print(list, 'this one got hello in it')
或者不使用 all 而使用 any
print(words, any(word in ttext for word in words))
Python 将两个布尔值之和视为 1 和 0。这意味着您可以通过添加列表中的所有值并检查它是否为 1 来检查列表中的一个真值。以下函数将检查布尔列表中是否有 x 个真值:
def xNumberAreTrue(booleans, x):
return sum(booleans) == x
在您的情况下,可以按如下方式使用此函数:
for words in product(*l):
print(words, xNumberAreTrue([word in ttext for word in words], 1))
其中 word in ttext
的计算结果为 true
或 false
。
好的,我想我们终于到了:
from itertools import product, chain
from string import punctuation
list1 = ['abra', 'hello', 'cfre']
list2 = ['dacc', 'ex', 'you', 'fboaf']
list3 = ['ihhio', 'oih', 'oihoihoo']
l = [list1, list2, list3]
def test(l, tt):
counts = {word.strip(punctuation):0 for word in tt.split()}
for word in chain(*product(*l)):
if word in counts:
counts[word] += 1
if sum(v > 1 for v in counts.values()) > 1:
return False
return True
输出:
In [16]: ttext = 'hello my name is brian'
In [17]: test(l,ttext)
Out[17]: True
In [18]: ttext = 'hello how are you?'
In [19]: test(l,ttext)
Out[19]: False
from itertools import product
ttext = 'hello how are you?'
list1 = ['abra', 'hello', 'cfre']
list2 = ['dacc', 'ex', 'you', 'fboaf']
list3 = ['ihhio', 'oih', 'oihoihoo']
l = [list1, list2, list3]
所以我有上面的列表,我需要知道文本中是否只有一个单词(只有一个)
我想要的:例如,如果在文本文本中我有 "hello my name is brian",它会说“好的,只有一个词”,但如果我在文本文本中的列表中有多个词,那么 'error'...
这里检查是否所有的单词都在文本中,我该如何检查所有列表中是否只有一个单词在文本中
for words in product(*l):
print(words, all(word in ttext for word in words))
(('abra', 'dacc', 'ihhio'), False)
(('abra', 'dacc', 'oih'), False)
(('abra', 'dacc', 'oihoihoo'), False)
(('abra', 'ex', 'ihhio'), False)
(('abra', 'ex', 'oih'), False)
(('abra', 'ex', 'oihoihoo'), False)
(('abra', 'you', 'ihhio'), False)
(('abra', 'you', 'oih'), False)
(('abra', 'you', 'oihoihoo'), False)
(('abra', 'fboaf', 'ihhio'), False)
(('abra', 'fboaf', 'oih'), False)
(('abra', 'fboaf', 'oihoihoo'), False)
(('hello', 'dacc', 'ihhio'), False)
(('hello', 'dacc', 'oih'), False)
(('hello', 'dacc', 'oihoihoo'), False)
(('hello', 'ex', 'ihhio'), False)
(('hello', 'ex', 'oih'), False)
(('hello', 'ex', 'oihoihoo'), False)
(('hello', 'you', 'ihhio'), False)
(('hello', 'you', 'oih'), False)
(('hello', 'you', 'oihoihoo'), False)
(('hello', 'fboaf', 'ihhio'), False)
(('hello', 'fboaf', 'oih'), False)
(('hello', 'fboaf', 'oihoihoo'), False)
(('cfre', 'dacc', 'ihhio'), False)
(('cfre', 'dacc', 'oih'), False)
(('cfre', 'dacc', 'oihoihoo'), False)
(('cfre', 'ex', 'ihhio'), False)
(('cfre', 'ex', 'oih'), False)
(('cfre', 'ex', 'oihoihoo'), False)
(('cfre', 'you', 'ihhio'), False)
(('cfre', 'you', 'oih'), False)
(('cfre', 'you', 'oihoihoo'), False)
(('cfre', 'fboaf', 'ihhio'), False)
(('cfre', 'fboaf', 'oih'), False)
(('cfre', 'fboaf', 'oihoihoo'), False)
编辑: 如果列表中只有一个单词在文本中:if ttext = 'hello my name is brian' then 'ok there's only one word of the lists that is in ttext' 但是如果我有 'hello how are you' 我有 'hello' 和 'you' 所以 'not ok two word of the lists are in ttext'
不确定你想在这里实现什么,但你可以尝试这样的事情:
for words in product(*l):
print(words, len(word for word in words if word in ttext) == 1)
for list in l:
if 'hello' in list:
print(list, 'this one got hello in it')
或者不使用 all 而使用 any
print(words, any(word in ttext for word in words))
Python 将两个布尔值之和视为 1 和 0。这意味着您可以通过添加列表中的所有值并检查它是否为 1 来检查列表中的一个真值。以下函数将检查布尔列表中是否有 x 个真值:
def xNumberAreTrue(booleans, x):
return sum(booleans) == x
在您的情况下,可以按如下方式使用此函数:
for words in product(*l):
print(words, xNumberAreTrue([word in ttext for word in words], 1))
其中 word in ttext
的计算结果为 true
或 false
。
好的,我想我们终于到了:
from itertools import product, chain
from string import punctuation
list1 = ['abra', 'hello', 'cfre']
list2 = ['dacc', 'ex', 'you', 'fboaf']
list3 = ['ihhio', 'oih', 'oihoihoo']
l = [list1, list2, list3]
def test(l, tt):
counts = {word.strip(punctuation):0 for word in tt.split()}
for word in chain(*product(*l)):
if word in counts:
counts[word] += 1
if sum(v > 1 for v in counts.values()) > 1:
return False
return True
输出:
In [16]: ttext = 'hello my name is brian'
In [17]: test(l,ttext)
Out[17]: True
In [18]: ttext = 'hello how are you?'
In [19]: test(l,ttext)
Out[19]: False