在Python中组合3个布尔掩码

bar*_*ard 8 python boolean-logic

我有3个列表:

a = [True, False, True]
b = [False, False, True]
c = [True, True, False]
Run Code Online (Sandbox Code Playgroud)

当我输入

a or b or c
Run Code Online (Sandbox Code Playgroud)

我想找回一份清单

[True, True, True]
Run Code Online (Sandbox Code Playgroud)

但我回来了

[True, False, True]
Run Code Online (Sandbox Code Playgroud)

有什么想法吗?我该如何组合这些面具?

Jos*_*ell 9

您的or操作员将列表比较为整个对象,而不是其元素.由于a不是一个空列表,它的计算结果为true,并成为结果or.bc甚至不进行评估.

要按位置生成三个列表的逻辑OR,您必须遍历其内容并对每个位置的值进行OR运算.要将一堆可迭代转换为其分组元素的列表,请使用zip().要检查iterable中的任何元素是否为真(其整个内容的OR),请使用any().用列表理解一次完成这两个:

mask = [any(tup) for tup in zip(a, b, c)]
Run Code Online (Sandbox Code Playgroud)

  • 很好的回答,谢谢!如果有人想知道,要检查所有元素是否为True,请使用all()而不是any(). (3认同)

Dev*_*per 9

这个怎么样:

from numpy import asarray as ar

a = [True, False, True]
b = [False, False, True]
c = [True, True, False]
Run Code Online (Sandbox Code Playgroud)

尝试:

>>> ar(a) | ar(b) | ar(c)                  #note also the use `|` instead of `or`
array([ True, True, True], dtype=bool)
Run Code Online (Sandbox Code Playgroud)

所以不需要zip等等


Mat*_*lia 6

or如果它的计算结果为true,则返回第一个操作数,非空列表的计算结果为true; 因此,如果它是非空列表,a or b or c将始终返回a.

可能你想要的

[any(t) for t in zip(a, b, c)]
Run Code Online (Sandbox Code Playgroud)

(这个作品也是逐元素and如果更换anyall)