2017-08-15 33 views
3

我正在使用一个简单的系统来检查是否有一些被禁止的单词当前在一个字符串中,但我想改进它来显示有问题的单词,所以我添加了线“如果有的话”检测到列表的显示元素

print ("BANNED WORD DETECTED : ", word) 

但我得到的错误

"NameError: name 'word' is not defined" 

如果觉得现在的问题是,我的系统只是检查是否有任何的话是在列表中没有“存放”的地方,也许我我误解了Python的列表系统,对于我应该修改的任何建议?

# -*- coding: utf-8 -*- 

bannedWords = ['word1','word2','check'] 
mystring = "the string i'd like to check" 

if any(word in mystring for word in bannedWords): 
    print ("BANNED WORD DETECTED : ", word) 
else : 
    print (mystring) 
+0

看看这里:https://stackoverflow.com/questions/16505456/how-exactly-does-the-python-any功能工作 – Daneel

回答

4

any()是不适合本,用生成的表达与next()代替或列表理解:

banned_word = next((word for word in mystring.split() if word in bannedWords), None) 
if banned_word is not None: 
    print("BANNED WORD DETECTED : ", word) 

或者多个单词:

banned_words = [word for word in mystring.split() if word in bannedWords] 
if banned_words: 
    print("BANNED WORD DETECTED : ", ','.join(banned_words)) 

为了提高O( 1)成员资格测试,使bannedWords a set而不是list

+0

感谢您的帮助,这完美的作品。我只想指出另一个用户在删除他的帖子之前所说的内容,您还可以在“.split()”之前添加“.lower()”来检查单词列表,而不考虑大小写。 – RoiYeti

+1

@RoiYeti当然,你可以使用'mystring.lower()。split()'进行不区分大小写的搜索(假设所有被禁止的单词都是小写)。或者使用'str.casefold()'。不要删除这个问题,这对未来的其他人来说可能是一个有用的问题,这就是SO的工作原理! –

3

请不要在这里使用any。发电机也不是合适的工具。你实际上需要一个列表理解来收集所有匹配的单词。

matching = [word for word in bannedWords if word in mystring] 
if matching: 
    print ("BANNED WORD(S) DETECTED : ", ','.join(matching)) 
+4

这将产生布尔值的权利? –

+0

对不起,是的,编辑。 –

0

你可以很容易地做到这一点: -

只需要一个参考变量来检查它是否在循环内找到任何东西。

detected = False ; 
for word in bannedWords: 
    if word in mystring : 
      detected = True ; 
      print("Detected Banned word " ,word) ; 

if not detected: 
    print(mystring) ; 

如果你想要一个更Python的方式: -

print("Banned words are {}".format([word for word in bannedWords if word in mystring]) if len([word for word in bannedWords if word in mystring]) else mystring) ;