2013-07-23 104 views
-3

我剛剛接觸編程,剛剛開始學習Python。我想創建一個小程序,只需檢測您是否在條目中輸入了一個「壞詞」。查看列表中的項目是否在Python中的另一項目中

name = input ('Please enter your name. ') 
badword=['foo', 'bar'] 
if name in badword: 
    print ('No.') 
else: 
    print ('Yes') 

這種方式不起作用,因爲它採取了輸入內容的全部內容,並且正在搜索該條目的列表。如果我嘗試給我們:

if badword in name: 

然後我只是得到一個錯誤。我可以調用列表的每個部分,但是這是很多代碼,尤其是如果你輸入不同類型的壞詞,並且這隻會讓我知道我可以用更少的代碼完成冗長的工作。有一點在這裏輸了,谷歌搜索已經幹了。

回答

5

你需要循環的badword列表測試每個字

for word in badword: 
    if word in name: 
     print('No.') 
     break 
else: 
    print('Yes.') 

else條款是for語句的一部分;當循環是而不是break語句中斷時執行,所以在這種情況下,如果badword中沒有任何值匹配。

這可以用any() function和發電機表達被縮短:

if any(word in name for word in badword): 
    print('No.') 
else: 
    print('Yes.') 
1

你的第二次嘗試:if badword in name幾乎是對的。您需要檢查BADWORD每一個項目 - 這樣的事情:

if any([ word for word in badword if word in name ]): 
    print('No') 
    break 
else: 
    print('Yes') 

any返回true,如果任何條件匹配。 []之間的位是一個列表理解,它返回一個新的列表。 e.g:

print([ word for word in badword ]) 

最後if word in name是addign項目到新的名單,只項條件,其條件是True在新的列表中結束。

+0

無需在內存中創建一箇中間表,如果你不打算使用它,'any'正常工作與生成器表達式。 –

+0

是的 - 很好。 Martijn的回答高漲。謝謝 :) – SteveLove

0
inputs = [" some BAD sentense ", "some right sentense"] 
bad_words_list = ["bad", "wrong"] 

def check(enter): 
    """Check for word in bad words list. Note, check process not key sensitive. 

    Return True if sentense contains bad word.""" 
    sentense = enter.lower().split() 
    for word in bad_words_list: 
     if word.lower() in sentense: 
      return False 
    return True 

print "Is sentense bad? " + str(check(inputs[0])) 
print "Is sentense bad? " + str(check(inputs[1])) 

測試:

$ python test.py 
Is sentense bad: False 
Is sentense bad: True 
相關問題