How does all() in python work on empty lists

前端 未结 4 1188
忘掉有多难
忘掉有多难 2020-12-14 19:51

I am referring to the following python code

all(a==2 for a in my_list)

I expect the above code to return True if all the elements in my_li

相关标签:
4条回答
  • 2020-12-14 20:33

    It's true because for every element in the list, all 0 of them, they all are equal to 2.

    You can think of all being implemented as:

    def all(list, condition):
      for a in list:
        if not condition(a):
          return false
      return true
    

    Whereas any is:

    def any(list, condition):
      for a in list:
        if condition(a):
          return true
      return false
    

    That is to say, all is innocent until proven guilty, and any is guilty until proven innocent.

    0 讨论(0)
  • 2020-12-14 20:36

    "all" applied to an empty list is "vacuously true", as is easily confirmed:

    >>> all([])
    True
    

    Similarly, "if 0 = 1 then the moon is square" is true. More generally, "all P are Q" -- if there are no P's then the statement is considered true, as it can be captured formally as "For all x, if x is P then x is Q". Ultimately, these are true because the conditional logical operator (if-then) evaluates to True whenever the antecedent (the first clause) is False: "if False then True" evaluates to True. Recall that "if A then B" is equivalent to "(not A) or B".

    0 讨论(0)
  • 2020-12-14 20:48

    Consider a recursive definition of all:

    def all(L):
        if L:
            return L[0] and all(L[1:])
        else:
            ???
    

    If every element in L is true, then it must be true that both the first item in L is true, and that all(L[1:]) is true. This is easy to see for a list with several items, but what about a list with one item. Clearly, every item is true if the only item is true, but how does our recursive formulation work in that case? Defining all([]) to be true makes the algorithm work.

    Another way to look at it is that for any list L for which all(L) is not true, we should be able to identify at least one element, a, which is not true. However, there is no such a in L when L is empty, so we are justified in saying that all([]) is true.

    The same arguments work for any. If any(L) is true, we should be able to identify at least one element in L that is true. But since we cannot for an empty list L, we can say that any([]) is false. A recursive implementation of any backs this up:

    def any(L):
        if L:
            return L[0] or any(L[1:])
        else:
            return False
    

    If L[0] is true, we can return true without ever making the recursive call, so assume L[0] is false. The only way we ever reach the base case is if no element of L is true, so we must return False if we reach it.

    0 讨论(0)
  • 2020-12-14 20:48

    From office documents.

    all(iterable)
    Return True if all elements of the iterable are true (or if the iterable is empty). Equivalent to:

    def all(iterable):
        for element in iterable:
            if not element:
                return False
        return True
    

    New in version 2.5.

    any(iterable)
    Return True if any element of the iterable is true. If the iterable is empty, return False. Equivalent to:

    def any(iterable):
        for element in iterable:
            if element:
                return True
        return False
    

    New in version 2.5.

    0 讨论(0)
提交回复
热议问题