2017-05-01 15 views
2

私は二つのリストがあるとします。Pythonのブール演算 - 矛盾した結果

>>> y 
[False, False, True, False, True, False, False, True, False, True, False, False] 
>>> z 
[False, True, True, True, True, True, False, False, False, False, False, True] 

それから私は、次のようにします。下図のように

>>> y or z 
[False, False, True, False, True, False, False, True, False, True, False, False] 
>>> z or y 
[False, True, True, True, True, True, False, False, False, False, False, True] 

は正解はすべきではありませんか?

[False, True, True, True, True, True, False, True, False, True, False, True] 

私もandと間違った答えを得る:

>>> y and z 
[False, True, True, True, True, True, False, False, False, False, False, True] 
>>> z and y 
[False, False, True, False, True, False, False, True, False, True, False, False] 

私は奇妙な結果と1と0をテストした:私は間違って

>>> y=[0,0,0,0,0] 
>>> z=[1,1,1,1,1] 
>>> y or z 
[0, 0, 0, 0, 0] 
>>> z or y 
[1, 1, 1, 1, 1] 
>>> y and z 
[1, 1, 1, 1, 1] 
>>> z and y 
[0, 0, 0, 0, 0] 

何をしているのですか?

+0

これがなぜ起こるのかを理解するには、bool([False])のようなbool呼び出しでリストをラップしてみてください。 –

+0

答えが示すように、 'または'はこのようには動作しません。しかし、 'numpy.logical_or'はこのように動作しますので、あなたにとって役に立つかもしれません。 https://docs.scipy.org/doc/numpy/reference/generated/numpy.logical_or.html – Stuart

答えて

1

正しいアプローチのようなリストの内包を行うことができます:

[a or b for a, b in zip(y, z)] 

and操作のための正しいアプローチ:

[a and b for a, b in zip(y, z)] 

None, False, 0, '',(), [], {} and few more(ここに挙げた - >Truth Value Testing)は、Falseとみなされます。

ここにいくつかの例です:

[][False]bool([False])

>>> [] and [False] 
[] 
>>> bool([] and [False]) 
False 

[]を使用して[False]が故にここTrue

>>> [] or [False] 
[False] 
>>> bool([] or [False]) 
True 
Trueで、 Falseあるその空ではない、チェック以降 Trueで、 Falseです
6

y or zは、個々の要素に対してどのように動作するか振る舞いません。代わりに、最初の引数(y)の「真実性」を評価します。 yは空ではないリストなので、trueと評価されます。その後、全体の文はyと評価されます。

同様に、z or yは、zが真実であるかどうかを調べます(これは空ではないリストなので)。したがって、この文はと評価され、yまたはその中の要素は見られません。ここで

は、いくつかの明確な例があります:このケアでは、右側のリストは、文の値になるよう

>>> [1,2,3,4] or [5,6,7,8] 
[1, 2, 3, 4] 
>>> ['this','is','a','list'] or ['and','here','is','another'] 
['this', 'is', 'a', 'list'] 

空のリストは、「偽-Y」として評価されます。

>>> [] or ['and','here','is','another'] 
['and', 'here', 'is', 'another'] 

リストの順番を入れ替えることは真として評価する最初のものが結果になることを示しています

>>> ['and','here','is','another'] or ['this','is','a','list'] 
['and', 'here', 'is', 'another'] 

あなたが望むものを達成するために、あなたはor操作に

[ 
    y_item or z_item 
    for y_item, z_item 
    in zip(y, z) 
] 
+0

または '[zip(y、z)内の項目の任意の項目] ' –

+0

' any'を使用するとブール値を返します「真実」リストの価値そのものではなく、OPが望むものであってもなくてもよい。 –

関連する問題