奇妙な結果が得られ、and
またはor
演算子をPythonの2つのブールリストに適用しようとしました。私は実際に私が期待していたものと正反対になります。
[True, False, False] and [True, True, False]
> [True, True, False]
[True, False, False] or [True, True, False]
> [True, False, False]
それは正常ですか、もしそうなら、なぜですか?
リストは個々の値を比較するのではなく、リスト内の値の存在を比較しています。
真実の変数a
およびb
の場合:
a and b
> b #The program evaluates a, a is truthy, it evaluates b, b is truthy, so it returns the last evaluated value, b.
a or b
> a #The program evaluates a, a is truthy, so the or statement is true, so it returns the last evaluated value, a.
さて、真実はタイプに依存します。たとえば、整数はmy_int != 0
、およびmy_int == 0
。あなたが持っている場合:
a = 0
b = 1
a or b
> b #The program evaluates a, a is falsy, so the or statement goes on to evaluate b, b is truthy, so the or statement is true and it returns the last evaluated value b.
実際に2つのリスト間で要素単位のブール演算が必要な場合は、numpy
モジュールの使用を検討してください。
>>> import numpy as np
>>> a = np.array([True, False, False])
>>> b = np.array([True, True, False])
>>> a & b
array([ True, False, False], dtype=bool)
>>> a | b
array([ True, True, False], dtype=bool)
and
とor
は実際にオペランドの1つに評価されるため、これは正常です。 x and y
のようなものです
def and(x, y):
if x:
return y
return x
x or y
のようなものです
def or(x, y):
if x:
return x
return y
両方のリストに値が含まれているため、両方とも "truthy" であるため、and
は第2オペランドに評価され、or
は第1オペランドに評価されます。
次のようなものが必要だと思います。
[x and y for x, y in Zip([True, False, False], [True, True, False])]
両方のリストは空ではないため、真実です。
and
とor
はどちらも、操作の値を決定したオペランドを返します。
and
の左側が真実であれば、右側を評価する必要があります。これは偽である可能性があるため、操作全体が偽(偽and
何でも偽)になる可能性があるためです。したがって、右側を返します。
or
の左側が真である場合、式が真であることを既に知っているため、右側を評価する必要はありません(true or
何でも真)。したがって、左側を返します。
リスト内のアイテムのペアワイズ比較を実行する場合は、リスト内包表記を使用します。例:
[x or y for (x, y) in Zip(a, b)] # a and b are your lists
非常に便利な方法:
>>> import numpy as np
>>> np.logical_and([True, False, False], [True, True, False])
array([ True, False, False], dtype=bool)
>>> np.logical_or([True, False, False], [True, True, False])
array([ True, True, False], dtype=bool)
機能的:
from operator import or_, and_
from itertools import starmap
a = [True, False, False]
b = [True, True, False]
starmap(or_, Zip(a,b)) # [True, True, False]
starmap(and_, Zip(a,b)) # [True, False, False]