两个布尔列表之间的逻辑运算
Logical operation between two Boolean lists
我得到一个奇怪的结果,我尝试将 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.
现在,truthy 取决于类型。例如,整数对于 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.
我想你需要这样的东西:
[x and y for x, y in zip([True, False, False], [True, True, False])]
这是正常的,因为 and
和 or
实际上求值为它们的操作数之一。 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
由于您的两个列表都包含值,因此它们都是 ,因此 and
计算为第二个操作数,or
计算为第一个。
两个列表都是真实的,因为它们都是非空的。
and
和 or
return 决定操作值的操作数。
如果and
的左边是真值,那么它必须计算右边的值,因为它可能是假的,这会使整个操作为假(假and
任何东西都是假的) .因此,它 return 是右侧。
如果or
的左边为真,则不需要计算右边,因为它已经知道表达式为真(真or
任何东西都为真)。所以它 return 是左边。
如果您希望对列表中的项目进行成对比较,请使用列表理解,例如:
[x or y for (x, y) in zip(a, b)] # a and b are your lists
如果您真正想要的是两个列表之间的逐元素布尔运算,请考虑使用 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)
非常方便的方式:
>>> 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]
我得到一个奇怪的结果,我尝试将 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.
现在,truthy 取决于类型。例如,整数对于 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.
我想你需要这样的东西:
[x and y for x, y in zip([True, False, False], [True, True, False])]
这是正常的,因为 and
和 or
实际上求值为它们的操作数之一。 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
由于您的两个列表都包含值,因此它们都是 and
计算为第二个操作数,or
计算为第一个。
两个列表都是真实的,因为它们都是非空的。
and
和 or
return 决定操作值的操作数。
如果and
的左边是真值,那么它必须计算右边的值,因为它可能是假的,这会使整个操作为假(假and
任何东西都是假的) .因此,它 return 是右侧。
如果or
的左边为真,则不需要计算右边,因为它已经知道表达式为真(真or
任何东西都为真)。所以它 return 是左边。
如果您希望对列表中的项目进行成对比较,请使用列表理解,例如:
[x or y for (x, y) in zip(a, b)] # a and b are your lists
如果您真正想要的是两个列表之间的逐元素布尔运算,请考虑使用 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)
非常方便的方式:
>>> 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]