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

Har*_*her 0 python

我有一个包含'Good'这个词的同义词的列表(这个列表在这里缩短了)

good_synonym = ['Good','good','Well','well']
Run Code Online (Sandbox Code Playgroud)

该程序询问用户的感受

print = 'Hello, ' + name + ', How are you?'
status = raw_input('')
Run Code Online (Sandbox Code Playgroud)

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

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

if status contains a word in good_synonym:
    print ('That is good')
else:
    print ('That is not so good')
Run Code Online (Sandbox Code Playgroud)

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

但我不知道用哪个短语来做这个动作.

Mar*_*ers 7

而不是具有混合大小写单词的列表,使用set对象 ; 集合使会员测试和交叉点测试更容易.仅存储小写文本,并简单地小写输入字符串:

good_synonym = {'good', 'well'}
# good_synonym = set(['good', 'well'])  # Python 2.6
Run Code Online (Sandbox Code Playgroud)

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

if not good_synonym.isdisjoint(status.lower().split()):
    print ('That is good')
else:
    print ('That is not so good')
Run Code Online (Sandbox Code Playgroud)

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

您可能已经看过的其他解决方案,使用该any()功能 ; 给定一个生成器表达式它也可以是高效的,因为True如果任何输出为真,它将提前返回:

if any(word in good_synonym for word in status.lower().split()):
Run Code Online (Sandbox Code Playgroud)

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