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)
有什么想法吗?我该如何组合这些面具?
您的or
操作员将列表比较为整个对象,而不是其元素.由于a
不是一个空列表,它的计算结果为true,并成为结果or
.b
和c
甚至不进行评估.
要按位置生成三个列表的逻辑OR,您必须遍历其内容并对每个位置的值进行OR运算.要将一堆可迭代转换为其分组元素的列表,请使用zip()
.要检查iterable中的任何元素是否为真(其整个内容的OR),请使用any()
.用列表理解一次完成这两个:
mask = [any(tup) for tup in zip(a, b, c)]
Run Code Online (Sandbox Code Playgroud)
这个怎么样:
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
等等
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
如果更换any
用all
)