在Python中组合3个布尔掩码

时间:2013-11-17 04:18:07

标签: python boolean-logic

我有3个列表:

a = [True, False, True]
b = [False, False, True]
c = [True, True, False]

当我输入

a or b or c

我想找回一个

的列表
[True, True, True]

但我回来了

[True, False, True]

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

8 个答案:

答案 0 :(得分:9)

您的or运算符正在将列表作为整个对象进行比较,而不是它们的元素。由于a不是空列表,因此它的计算结果为true,并成为or的结果。 <{1}}和b甚至没有评估过。

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

any()

答案 1 :(得分:9)

这个怎么样:

from numpy import asarray as ar

a = [True, False, True]
b = [False, False, True]
c = [True, True, False]

尝试:

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

所以不需要zip等。

答案 2 :(得分:6)

or返回第一个操作数(如果它的计算结果为true),非空列表的计算结果为true;因此,如果a or b or c是非空列表,a将始终返回[any(t) for t in zip(a, b, c)]

可能你想要

and

(如果您使用any替换all

,这也适用于按元素{{1}}

答案 3 :(得分:2)

a被视为true,因为它包含值; bc未被评估。

>>> bool([])
False
>>> bool([True])
True
>>> bool([False])
True

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

根据Boolean Operations

  

表达式x or y首先评估x;如果x为真,则返回其值;否则,将评估y并返回结果值。

答案 4 :(得分:1)

试试这个:

a = [True, False, True]
b = [False, False, True]
c = [True, True, False]

res = [a[i] or b[i] or c[i] for i in range(len(a))]
print res

答案 5 :(得分:1)

以下是如何使用numpy快速(大型数组):

import numpy as np
a = [True, False, True,...]
b = [False, False, True,...]
c = [True, True, False,...]
res = (np.column_stack((a,b,c)).any(axis=1)
print res

请注意,a成为第一列,b成为第二列,依此类推使用np.column_stack()。然后在np.any()上的arrayaxis=1(逻辑OR)进行a,这将比较bcko.observable的第一个元素, 等等等等;产生一个布尔向量,其长度与您想要比较的向量相同。

答案 6 :(得分:1)

怎么样

result = numpy.logical_or(a, b, c)
print(result)

答案 7 :(得分:0)

这是使用python的asterisk functionsAnimal{animalType=Lion, name=Leo, age=5, healthConcerns=Cut on left front paw, feedingSchedule=Twice daily} Animal{animalType=Tiger, name=Maj, age=15, healthConcerns=None, feedingSchedule=3x daily} *args)之一的好地方,这将允许您传递3或300000个列表。

**kwargs

在这里,您使用 a = [True, False, True] b = [False, False, True] c = [True, True, False] data_lists = [a,b,c] 将该列表扩展为参数,使用*将数据重新排列为列(作为列表),并使用zip检查该列中是否有任何单元格为{ {1}}。

any

例如,如果要处理大量列表,则相同,例如

True