2013-10-06 28 views
9

我的代碼是爲了一個井字遊戲和檢查繪製狀態,但我認爲這個問題可能會更有用的一般意義。python使用任何()和所有()來檢查一個列表是否包含一組值或另一個

我代表董事會名單,它看起來像這樣:

board = [1,2,3,4,5,6,7,8,9] 

當玩家走棋的詮釋他們移動了被替換他們的標誌(「X」或「O」) ,我已經有支票來尋找獲勝狀態,我不能做的是檢查一個抽籤狀態,其中沒有列表值是整數,但尚未設置獲勝狀態。

的代碼,我到目前爲止有:

if any(board) != playerOne or any(board) != playerTwo: 
    print 'continue' 
elif all(board) == playerOne or playerTwo: 
    print 'Draw' 

if語句作品中,ELIF不,我認爲這個問題是我的「或」經營者,我要檢查的是:如果每在板項目或者是playerOne標記或playerTwo標記,如果我在那裏,使代碼:

elif all(board) == playerOne or all(board) == playerTwo: 

我會檢查,看看是否在黑板上的每一個地方是playerOne或在黑板上的每一個地方是playerTwo,它不會。

那麼如何檢查棋盤是否被playerOne標記和playerTwo標記組合所佔用?

+3

這真的不是如何['任何()'](http://docs.python.org/3/library/functions.html#any)和['所有()' ](http://docs.python.org/3/library/functions.html#all)work:_「如果iterable的(any/all)元素爲true,則返回True。如果迭代器爲空,則返回False。「_ –

回答

20

allany是採取可迭代函數,並確定任一:

    all()的情況下
  • :如果所有,所述值可迭代是非False;
  • any()的情況下:如果該可迭代中的值的任何是非False

所以你誤解了這些函數是如何工作的。

因此,下面做一些事情完全不是你想象它做什麼:

if any(foobars) == big_foobar: 

...因爲any(foobars)將首先評估要麼TrueFalse,然後是布爾值會比較big_foobar ,它基本上總是給你False,假設foobar不是布爾值。

注意: iterable可以是一個列表,但它也可以是一個生成器/生成器表達式(≈lazily求值/生成列表)或任何其他迭代器。

你要代替的是:

if any(x == big_foobar for x in foobars): 

基本上首先構造一個產生的序列的迭代布爾,在foobars每個項目,它的項目比較big_foobar併發射所產生boolean值結果序列:

tmp = (x == big_foobar for x in foobars) 

然後any走過去的所有項目中tmp並返回True只要它發現第一個True項目。這是因爲如果你做了以下內容:

foobars = ['big', 'small', 'medium', 'nice', 'ugly'] 
big_foobar = 'big' 
any(['big' == big_foobar, 'small' == big_foobar, 'medium' == big_foobar, ...]) 

注:作爲DSM所指出的,any(x == y for x in xs)情況下更好地表現爲簡單y in xs - 這是更容易讀,寫和快得多。

一些例子:

any(x > 5 for x in range(4)) # => False 
all(isinstance(x, int) for x in range(10)) # => True 
any(x == 'Erik' for x in ['Erik', 'John', 'Jane', 'Jim']) # => True 
all([True, True, True, False, True]) # => False 

我會強烈建議簡單地用anyall與Python的外殼,或各種輸入打更好,但在IPython殼得到這個是如何工作的感覺在繼續編寫實際代碼之前。

參見:http://docs.python.org/2/library/functions.html#all

+2

我認爲不是'any(x foobars中的x == big_foobar)''在foobars中寫'big_foobar會更加地道。 – DSM

+0

好的,所以改變我的路線:如果有的話(board)!= playerOne或任何(board)!= playerTwo: 會變成: 如果有的話(x!= playerOne或x!= playerTwo for x in board) :? – DasSnipez

+0

@DSM:是的,當然,但我必須以我的例子爲基礎:) –

相關問題