Python检查列表中是否有字符串的任何部分

时间:2016-09-28 08:50:47

标签: python

我有一个列表,其中包含单词' Good' (此列表在此缩短)

good_synonym = ['Good','good','Well','well']

该程序询问用户的感受

print = 'Hello, ' + name + ', How are you?'
status = raw_input('')

但有时候,用户可能会回答问题"我很好" (或类似的)

如果答案中包含好同义词列表中的单词,我希望程序回复

if status contains a word in good_synonym:
    print ('That is good')
else:
    print ('That is not so good')

请注意,第一行不是真正的python语言

但我不知道用哪个词来做行动。

5 个答案:

答案 0 :(得分:7)

使用set objects代替带有大小写混合的单词的列表;集合使会员测试和交叉点测试更容易。仅存储小写文本,并简单地小写输入字符串:

good_synonym = {'good', 'well'}
# good_synonym = set(['good', 'well'])  # Python 2.6

现在测试输入字符串(小写并在空格上拆分)是否为disjoint set set.isdisjoint()。如果它不是一个不相交的集合,则两个集合之间存在重叠,这意味着至少存在'good''well'

if not good_synonym.isdisjoint(status.lower().split()):
    print ('That is good')
else:
    print ('That is not so good')

测试集合是否不相交是有效的;它只需要测试单词,直到good_synonym集中的第一个单词快速返回False。您可以改为计算交叉点,但是这将始终测试状态中的所有字以构建新的集合对象。

您可能已经看过的其他解决方案,请使用any() function;给定一个generator expression它也可以有效,因为如果任何输出为真,它会提前返回True

if any(word in good_synonym for word in status.lower().split()):

然而,这在Python代码中进行了所有循环和测试,而set.isdisjoint()完全用C代码实现。

答案 1 :(得分:1)

有很多方法可以尝试这样做。既然你是一个初学者,那就让我们去做一些有用的事情 - 效率不应该是你的首要考虑因素。

status = status.split() # breaks response into words
if any(s in good_synonyms for s in status):
    print('That is good')

当然,它不会阻止你的程序表现得好像“不好”是一个值得快乐回答的回复,但这是一个编程网站。

答案 2 :(得分:0)

简单!

我们可以遍历good_synonyms列表并检查输入字符串中是否存在它们的任何

if any(synonym in status for synonym in good_synonyms):
    print('That is good')
else:
    print('That is not so good')

PS:为了节省内存,您可以将同义词仅以小写形式存储为['good','well'],当您检查这些是否在'status'变量中时,您可以只应用它上面的.lower()只是将整个字符串转换为小写字母,如下所示:

good_synonyms = ['good', 'well']
if any(synonym in status.lower() for synonym in good_synonyms):
     print('That is good')

希望这有帮助!

注意:holdenweb的答案也有效,但实际上并不需要对状态应用拆分功能,因为您可以检查字符串中是否存在单词(前提是字符串中的单词是分开的通过空格)或不使用上述'in'关键字。

答案 3 :(得分:-1)

这是一个NLP问题,以下代码是检测同义词的简单版本:

def is_contains_synonym(sentence, synonym):
    token = sentence.split(' ')
    return len(filter(lambda x: x in synonym, token)) > 0

if is_contains_synonym(status, good_synonym):
    print ('That is good')
else:
    print ('That is not so good')

答案 4 :(得分:-1)

一个简单而简单的解决方案是使用正则表达式进行模式匹配,如下所示:

import re

line = "it is good"
good_synonyms = ["good","well"]

line = line.lower()
if any(re.search(synonym,line) for synonym in good_synonyms):
    print "That is good"
else:
    print "nope"

search的{​​{1}}函数在字符串中的任何位置查找模式的匹配,并返回一个布尔值,然后可以在带有re的if语句中使用