2014-01-25 55 views
2

我有以下邏輯麻煩 'B':如果 'A' 或L,其中L是一個列表(Python)的

可以說我有一個列表L = ['a', 'b', 'c']


兩個項目在列表...

if ('a' or 'b') in L: 
    print 'it\'s there!' 
else: 
    print 'No sorry' 

打印It's there!


只有第一項是在列表...

if ('a' or 'd') in L: 
    print 'it\'s there!' 
else: 
    print 'No sorry' 

打印It's there!


列表中的項目都沒有...

if ('e' or 'd') in L: 
    print 'it\'s there!' 
else: 
    print 'No sorry' 

打印No sorry


這裏的混亂的一個只有列表中的項目...

if ('e' or 'a') in L: 
    print 'it\'s there!' 
else: 
    print 'No sorry' 

打印No sorry


我不明白這是爲什麼不註冊爲一個真實的陳述。這是如何推廣到陳述與n條件?

前額打耳光簡單的答案在3,2,1 ...

+0

「==」的「在L」似乎表現不同 –

+0

它看起來像我的上述評論的行爲,是不正確 –

回答

10

讓我們打破的表達:

('e' or 'a')首先會檢查'e'爲True。如果是,表達式將返回'e'。如果不是,則返回'a'

由於所有非空字符串都會返回True,因此此表達式始終會返回'e'。這意味着if ('e' or 'a') in L:可以翻譯爲if 'e' in L,在這種情況下是False

檢查一個列表是否至少包含一組值的一種更通用的方法是使用any函數加上生成器表達式。

if any(c in L for c in ('a', 'e')): 
3

使用這個代替:

if 'a' in L or 'b' in L: 

如果我們想檢查這一切的 「項目」這些在列表中,all和發電機的理解是你的朋友:

items = 'a', 'b', 'c' 
if all(i in L for i in items): 

或者,如果這些項目的任何是在列表中,使用any

if any(i in L for i in items) 
+0

如果我要檢查是否有n個項目是在列表中,確實「在L:」必須重複n次? –

+0

是的,你要做的是檢查'a'或'b'是否爲True或False,並且在Python中非空的字符串評估爲true。 –

+0

@BrianLeach我認爲有一個更明智的做法..堅持下去。我會想到更酷的東西。 – aIKid

1

字符串(除了一個empy串)將總是爲True當它們被作爲一個布爾評價。雖然與or/and評估都將返回True,但它們之間的差別不大:

print 'a' or 'b' # Output: a 
print 'a' and 'b' # Output: b 

or:將返回第一個字符串 and:將返回最後一個字符串

當你

if ('a' or 'b') in L: 

,它會檢查'a' or 'b'這是'a',然後檢查'a'是否在L。其他情況也會發生類似的情況(根據我之前解釋的情況)。

所以,當你做

if ('e' or 'a') in L: 

'e' or 'a'將評估爲'e',因此它會打印'No Sorry',因爲'e'L

你必須做什麼是比較元素是否在列表分別

if 'a' in L or 'b' in L: 
if 'a' in L or 'd' in L: 
if 'e' in L or 'd' in L: 
if 'e' in L or 'a' in L: 
0

訣竅你得到的輸出是and,並在Python or總是爲自己的一個操作數 - 普遍認爲,有一個被最後評估,以確定操作感實性:

1 or 2 # returns 1 because since 1 is true, there's no need to evaluate the second argument. 
1 or 0 # returns 1, same thing. 
0 or 2 # returns 2 because 0 is false, so we need to evaluate the second arg to check whether the operation is true. 
0 or "" # returns "" (both 0 and "" are false). 

1 and 2 # returns 2 because for an and operation to be true, both its operands need to be checked for truthiness. 
0 and 2 # returns 0, because we know that if the first operand is false, so is the whole operation. 
0 and None # Still returns 0, we don't even need to check the second operand. 

因此,當你評估(1 or 2) in [1, 3, 5](其中i ñ真相你想1 in [1, 3, 5] or 2 in [1, 3, 5]),真正發生的是(1 or 2)評估爲1,並且您的操作變爲1 in [1, 3, 5]

相關問題