2015-04-01 63 views
2

我有2個Python列表,內容如下:瞭解Python中的任意關鍵字if語句

>>> clean = ['SNAT2VIP', 'http2https'] 
>>> ugly = ['/Common/SNAT2VIP', '/Common/http2https'] 

我現在需要通過清潔每個成員進行迭代,看看它是否在任何地方醜陋的存在。 「存在」,我的意思是它可以作爲一個整體存在,或者作爲一個醜陋的元素存在。

這是我想出了:

>>> for item in clean: 
...  if (word in item for word in ugly): 
...   print "yes" 
...  else: 
...   print "no" 
... 
yes 
yes 

工程,我expect.However,如果我添加any,輸出變化如下:

>>> for item in clean: 
...  if any(word in item for word in ugly): 
...   print "yes" 
...  else: 
...   print "no" 
... 
no 
no 

是什麼any做些什麼來改變輸出 ?

+0

它的意思是「如果任何一個字(迭代醜陋的)內部存在項目,然後是打印,否則打印沒有」 – ha9u63ar 2015-04-01 13:38:57

+1

在你的第一個'if',爲您打造一臺發電機。你永遠不會評估這個生成器,但是當一個生成器被解釋爲一個布爾值時,它始終是「truthy」,所以它總是如此。 – 2015-04-01 13:39:43

回答

3

當你的表達(word in item for word in ugly)Boolean值將始終是True因爲它返回一個generator對象。

您可以使用bool檢查內置功能。

bool(word in item for word in ugly) 

因此,爲了與any內置功能工作,你必須遵循: -

if any(item in word for word in ugly): 

相反的: -

if any(word in item for word in ugly): 

當你的word串駐留在item字符串。

>>> 'SNAT2VIP' in '/Common/SNAT2VIP' 
True 
>>> 
>>> '/Common/SNAT2VIP' in 'SNAT2VIP' 
False 
2

正在檢查的方式不對周圍

if any(word in item for word in ugly): 

此檢查在ugly所有單詞存在於每個項目clean爲好。你想檢查其他方式。更改爲

for word in clean: 
    if any(word in item for item in ugly): 
     print "yes" 
+1

這隻會檢查單詞是否在列表中,而不是它是否包含在列表中的單詞之一中。 – 2015-04-01 13:42:34

+0

啊,你是對的。讓我解決這個問題.. – 2015-04-01 13:43:39

1

試試這個使用的代碼,如果馬車comprehension

>>>any(j for i in clean for j in ugly if i in j) 
True 
2

你的第一位。發電機始終具有True的真值 - 無論發電機可能產生哪些項目,或者即使發電機不產生任何項目。例如。

>>> print("false values generator: {}".format(bool(False for item in [1]))) 
false values generator: True 
>>> print("empty values generator truth value: {}".format(bool(True for item in []))) 
empty values generator truth value: True 

因此,您的代碼將始終輸入if語句的True分支。

你也有你的論點錯了。你正在檢查這個「醜陋的」單詞是否在「乾淨」的單詞中。如果你爲你的變量選擇了更清晰的名字,這將更加明顯。下面將如預期:

for clean_word in clean: 
    if any(clean_word in ugly_word for ugly_word in ugly): 
     print("yes") 
    else: 
     print("no") 
+0

@ Dunes..i瞭解關於發電機總是返回真正的位,不管它們的值如何。但是,我不明白的是,任何與發電機一起使用,爲什麼我得到一個不.. – Amistad 2015-04-02 13:36:37

+0

'any'函數返回'False',因爲生成器返回的所有值都是'False'。這是因爲你問這些醜陋的單詞是否是乾淨的單詞,而不是乾淨的單詞是醜陋的單詞。這就是爲什麼我提到在未來嘗試選擇更好的變量名稱的原因。 – Dunes 2015-04-02 18:48:30