I get a weird result and I try to apply the and
or the or
operator to 2 Boolean lists in python. I actually get the exact opposite of what I was expec
Мore functional:
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]
If what you actually wanted was element-wise boolean operations between your two lists, consider using the numpy
module:
>>> 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)
This is normal, because and
and or
actually evaluate to one of their operands. x and y
is like
def and(x, y):
if x:
return y
return x
while x or y
is like
def or(x, y):
if x:
return x
return y
Since both of your lists contain values, they are both "truthy" so and
evaluates to the second operand, and or
evaluates to the first.
Your lists aren't comparing each individual value, they're comparing the existence of values in the list.
For any truthy variables a
and 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.
Now, truthy depends on the type. For example, integers are truthy for my_int != 0
, and are falsy for my_int == 0
. So if you have:
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.
Very convenient way:
>>> 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)
Both lists are truthy because they are non-empty.
Both and
and or
return the operand that decided the operation's value.
If the left side of and
is truthy, then it must evaluate the right side, because it could be falsy, which would make the entire operation false (false and
anything is false). Therefore, it returns the right side.
If the left side of or
is truthy, it does not need to evaluate the right side, because it already knows that the expression is true (true or
anything is true). So it returns the left side.
If you wish to perform pairwise comparisons of items in the list, use a list comprehension, e.g.:
[x or y for (x, y) in zip(a, b)] # a and b are your lists