Logical operation between two Boolean lists

对着背影说爱祢 提交于 2019-12-09 15:06:47

问题


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 expecting.

[True, False, False] and [True, True, False]
> [True, True, False]

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

Is that normal, and if yes, why?


回答1:


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.



回答2:


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)



回答3:


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.




回答4:


I think you need something like this:

[x and y for x, y in zip([True, False, False], [True, True, False])]



回答5:


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



回答6:


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)



回答7:


М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]


来源:https://stackoverflow.com/questions/47419342/logical-operation-between-two-boolean-lists

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!