我正在使用一个简单的系统来检查某些禁止的单词当前是否在字符串中,但我想改进它以显示有问题的单词,所以我添加了行
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)
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
作为set
而不是list
不要在这里使用any
。生成器也不是正确的工具。您实际上想要一个列表理解来收集所有匹配的单词。
matching = [word for word in bannedWords if word in mystring]
if matching:
print ("BANNED WORD(S) DETECTED : ", ','.join(matching))
你可以很容易地做到这一点:-
只需使用一个引用变量来检查它是否在循环中找到了任何内容。
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) ;