web-dev-qa-db-ja.com

2つのブールリスト間の論理演算

奇妙な結果が得られ、andまたはor演算子をPythonの2つのブールリストに適用しようとしました。私は実際に私が期待していたものと正反対になります。

[True, False, False] and [True, True, False]
> [True, True, False]

[True, False, False] or [True, True, False]
> [True, False, False]

それは正常ですか、もしそうなら、なぜですか?

11
Yohan Obadia

リストは個々の値を比較するのではなく、リスト内の値の存在を比較しています。

真実の変数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.
3
Davy M

実際に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)
10
jasonharper

andorは実際にオペランドの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オペランドに評価されます。

5
Patrick Haugh

次のようなものが必要だと思います。

[x and y for x, y in Zip([True, False, False], [True, True, False])]
3
AyumuKasuga

両方のリストは空ではないため、真実です。

andorはどちらも、操作の値を決定したオペランドを返します。

andの左側が真実であれば、右側を評価する必要があります。これは偽である可能性があるため、操作全体が偽(偽and何でも偽)になる可能性があるためです。したがって、右側を返します。

orの左側が真である場合、式が真であることを既に知っているため、右側を評価する必要はありません(true or何でも真)。したがって、左側を返します。

リスト内のアイテムのペアワイズ比較を実行する場合は、リスト内包表記を使用します。例:

[x or y for (x, y) in Zip(a, b)]     # a and b are your lists
3
kindall

非常に便利な方法:

>>> 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)
1
Markus Dutschke

機能的:

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]
1
Lecron