How to apply a logical operator to all elements in a python list

后端 未结 6 1667
日久生厌
日久生厌 2021-01-29 22:25

I have a list of booleans in python. I want to AND (or OR or NOT) them and get the result. The following code works but is not very pythonic.

def apply_and(alist         


        
相关标签:
6条回答
  • 2021-01-29 22:43

    As the other answers show, there are multiple ways to accomplish this task. Here's another solution that uses functions from the standard library:

    from functools import partial
    
    apply_and = all
    apply_or = any
    apply_not = partial(map, lambda x: not x)
    
    if __name__ == "__main__":
        ls = [True, True, False, True, False, True]
        print "Original: ", ls
        print "and: ", apply_and(ls)
        print "or: ", apply_or(ls)
        print "not: ", apply_not(ls)
    
    0 讨论(0)
  • 2021-01-29 22:45

    Here's another solution:

    def my_and(a_list):
        return not (False in a_list)
    
    def my_or(a_list):
        return True in a_list
    

    ANDing all elements will return True if all elements are True, hence no False in a list. ORing is similar, but it should return True if at least one True value is present in a list.

    0 讨论(0)
  • 2021-01-29 22:51

    Reduce can do this:

    reduce(lambda a,b: a and b, alist, True)
    

    As fortran mentioned, all is the most succinct way to do it. But reduce answers the more general question "How to apply a logical operator to all elements in a python list?"

    0 讨论(0)
  • 2021-01-29 22:52

    Logical and across all elements in a_list:

    all(a_list)
    

    Logical or across all elements in a_list:

    any(a_list)
    

    If you feel creative, you can also do:

    import operator
    def my_all(a_list):
      return reduce(operator.and_, a_list, True)
    
    def my_any(a_list):
      return reduce(operator.or_, a_list, False)
    

    keep in mind that those aren't evaluated in short circuit, whilst the built-ins are ;-)

    another funny way:

    def my_all_v2(a_list):
      return len(filter(None,a_list)) == len(a_list)
    
    def my_any_v2(a_list):
      return len(filter(None,a_list)) > 0
    

    and yet another:

    def my_all_v3(a_list):
      for i in a_list:
        if not i:
          return False
      return True
    
    def my_any_v3(a_list):
      for i in a_list:
        if i:
          return True
      return False
    

    and we could go on all day, but yes, the pythonic way is to use all and any :-)

    By the way, Python has not tail recursion elimination, so don't try to translate LISP code directly ;-)

    0 讨论(0)
  • 2021-01-29 22:59

    ANDing and ORing is easy:

    >>> some_list = [True] * 100
    # OR
    >>> any(some_list)
    True
    #AND
    >>> all(some_list)
    True
    >>> some_list[0] = False
    >>> any(some_list)
    True
    >>> all(some_list)
    False
    

    NOTing is also fairly easy:

    >>> [not x for x in some_list]
    [True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False]
    

    Of course, how you would use those results might require some interesting applications of DeMorgan's theorem.

    0 讨论(0)
  • 2021-01-29 23:08

    The idiom for such operations is to use the reduce function (global in Python 2.X, in module functools in Python 3.X) with an appropriate binary operator either taken from the operator module or coded explicitly. In your case, it's operator.and_

    reduce(operator.and_, [True, True, False])
    
    0 讨论(0)
提交回复
热议问题