2014-10-18 115 views
1

這是一個簡單的代碼片段,我有:算在Python If語句

>>> test = ['asas', 'asa12', 'sdsdsd12', 'vccvcvcv', 'rertrtt11'] 
>>> for i in test: 
...  if '11' in i: 
...   print i 
... 
rertrtt11 

作品作爲expected.Now趕上含有11或12的元件,我這樣做:

>>> test = ['asas', 'asa12', 'sdsdsd12', 'vccvcvcv', 'rertrtt11'] 
>>> for i in test: 
...  if '11' or '12' in i: 
...   print i 
... 
asas 
asa12 
sdsdsd12 
vccvcvcv 
rertrtt11 

這是意想不到的。我希望只捕捉11或12個元素,但輸出包含所有元素。

雖然試圖解決問題,我嘗試過的運營商試圖瞭解行爲:

>>> test = ['asas', 'asa12', 'sdsdsd12', 'vccvcvcv', 'rertrtt11'] 
>>> for i in test: 
...  if '11' and '12' in i: 
...   print i 
... 
asa12 
sdsdsd12 

現在我徹底的困惑,我在等一個空集,因爲有與兩個11沒有元素和12在他們的。是我的理解python中的操作符功能完全錯誤?

回答

5

'11' or '12' in i評估這樣

('11') or ('12' in i) 

所以,第一個部分是永遠truthy。這就是爲什麼所有這些都被打印。在第二種情況下,

('11') and ('12' in i) 

這裏,第一部分是始終Truthy,所以只會打印包含12的項目。您可能希望做

if '11' in i and '12' in i: 

if all(item in i for item in ('11', '12')): 

具有或條件,可以使用any功能,這樣

if any(item in i for item in ('11', '12')): 
1

爲了給你一個小而簡單的解決方法,你應該請嘗試:

if (('11' in i) or ('12' in i)): 
    #do something 

if (('11' in i) and ('12' in i)): 
    #do another thing 

這不是一個意外錯誤,請參閱文檔

1

orand運營商並不鏈你認爲他們做的方式。

if '11' and '12' in i: #this problem is the same for or 

首先蟒將執行'12' in i作爲in具有比and一個更高的優先級。然後andin測試返回'12',這可以隱式轉換爲True

要得到你真正想要的效果,你需要做的:

if '11' in i and '12' in i: # same for or 

這會正確地檢查是否'11'i,那麼如果'12'i,然後and/or結果這兩個測試一起。