Logical operation between two Boolean lists

前端 未结 7 2032
终归单人心
终归单人心 2021-02-07 15:58

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

相关标签:
7条回答
  • 2021-02-07 16:00

    I think you need something like this:

    [x and y for x, y in zip([True, False, False], [True, True, False])]
    
    0 讨论(0)
  • 2021-02-07 16:03

    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)
    
    0 讨论(0)
  • 2021-02-07 16:09

    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.

    0 讨论(0)
  • 2021-02-07 16:15

    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)
    
    0 讨论(0)
  • 2021-02-07 16:16

    М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]
    
    0 讨论(0)
  • 2021-02-07 16:17

    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
    
    0 讨论(0)
提交回复
热议问题