68

私のコードは Tic Tac Toe ゲーム用であり、描画状態をチェックしていますが、この質問は一般的な意味でより役立つと思います。

ボードを表すリストがあります。次のようになります。

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

プレーヤーが移動したとき、移動した int がマーカー (「x」または「o」) に置き換えられます。私はすでに、勝利状態を探すためのチェックを行っています。引き分けをチェックすることはできません。リスト値はいずれも int ではありませんが、勝利状態は設定されていません。

私がこれまでに持っているコード:

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

if ステートメントは機能しますが、elif は機能しません。問題は「or」演算子にあると思います。チェックしたいのは、ボード上のすべてのアイテムが playerOne マーカーまたは playerTwo マーカーのいずれかであるかどうかです。コード:

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

ボード上のすべての場所が playerOne であるか、ボード上のすべての場所が playerTwo であるかを確認しますが、そうではありません。

では、ボードが playerOne マーカーと playerTwo マーカーの組み合わせによって占有されているかどうかを確認するにはどうすればよいでしょうか?

4

1 に答える 1

136

一般的に言えば:

allanyは、 iterable を取り、 を返す関数Trueです。

  • の場合、all()イテラブルのどの値も偽ではありません。
  • の場合、any()少なくとも 1 つの値が true です。

xが偽の iffbool(x) == Falseです。値xは Truthy iffbool(x) == Trueです。

iterable 内の非ブール値は問題ありません —は、次のルールに従ってマップbool(x)(または、必要に応じて強制)します: の docstringは、「真実」/「偽」に対して「真」/「偽」という用語を使用し、具体的なブール値に対しては/を使用します。x00.0None[]()[]set()FalseTrueboolTrueFalse


特定のコード サンプルでは:

これらの関数がどのように機能するかを少し誤解しました。したがって、以下はあなたが思っていたこととはまったく違うことをします:

if any(foobars) == big_foobar:

...最初にまたはのいずれかany(foobars)に評価され、次にそのブール値が と比較されるため、通常は常に得られます(偶然に同じブール値でない限り)。TrueFalsebig_foobarFalsebig_foobar

注: iterable はリストにすることができますが、ジェネレータ/ジェネレータ式 (≈ 遅延評価/生成リスト) またはその他のイテレータにすることもできます。

代わりに必要なのは次のとおりです。

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

これは基本的に最初にブール値のシーケンスを生成する iterable を構築します — の各アイテムに対してfoobars、アイテムを比較しbig_foobar、結果のブール値を結果のシーケンスに出力します。

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

次にany、すべてのアイテムを調べて、最初の真の要素を見つけるとすぐにtmp戻ります。True次のことを行ったかのようです。

In [1]: foobars = ['big', 'small', 'medium', 'nice', 'ugly']                                        

In [2]: big_foobar = 'big'                                                                          

In [3]: any(['big' == big_foobar, 'small' == big_foobar, 'medium' == big_foobar, 'nice' == big_foobar, 'ugly' == big_foobar])        
Out[3]: True

注: DSM が指摘したように、any(x == y for x in xs)は同等ですy in xsが、後者の方が読みやすく、書き込みが速く、実行も高速です。

いくつかの例:

In [1]: any(x > 5 for x in range(4))
Out[1]: False

In [2]: all(isinstance(x, int) for x in range(10))
Out[2]: True

In [3]: any(x == 'Erik' for x in ['Erik', 'John', 'Jane', 'Jim'])
Out[3]: True

In [4]: all([True, True, True, False, True])
Out[4]: False

参照: http://docs.python.org/2/library/functions.html#all

于 2013-10-06T17:45:19.580 に答える