我有一个包含'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)
但我不知道用哪个短语来做这个动作.
而不是具有混合大小写单词的列表,使用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代码实现.