any() function in Python with a callback

前端 未结 8 1117
别那么骄傲
别那么骄傲 2020-12-13 01:34

The Python standard library defines an any() function that

Return True if any element of the iterable is true. If the iterable is empty, return False.

相关标签:
8条回答
  • 2020-12-13 01:58

    any function returns True when any condition is True.

    >>> any(isinstance(e, int) and e > 0 for e in [0 ,0, 1])
    True # Returns True because 1 is greater than 0.
    
    
    >>> any(isinstance(e, int) and e > 0 for e in [0 ,0, 0])
    False # Returns False because not a single condition is True.
    

    Actually,the concept of any function is brought from Lisp or you can say from the function programming approach. There is another function which is just opposite to it is all

    >>> all(isinstance(e, int) and e > 0 for e in [1, 33, 22])
    True # Returns True when all the condition satisfies.
    
    >>> all(isinstance(e, int) and e > 0 for e in [1, 0, 1])
    False # Returns False when a single condition fails.
    

    These two functions are really cool when used properly.

    0 讨论(0)
  • 2020-12-13 01:59

    While the others gave good Pythonic answers (I'd just use the accepted answer in most cases), I just wanted to point out how easy it is to make your own utility function to do this yourself if you really prefer it:

    def any_lambda(iterable, function):
      return any(function(i) for i in iterable)
    
    In [1]: any_lambda([1, 2, 'joe'], lambda e: isinstance(e, int) and e > 0
    Out[1]: True
    In [2]: any_lambda([-1, '2', 'joe'], lambda e: isinstance(e, int) and e > 0)
    Out[2]: False
    

    I think I'd at least define it with the function parameter first though, since that'd more closely match existing built-in functions like map() and filter():

    def any_lambda(function, iterable):
      return any(function(i) for i in iterable)
    
    0 讨论(0)
  • 2020-12-13 02:00

    You should use a "generator expression" - that is, a language construct that can consume iterators and apply filter and expressions on then on a single line:

    For example (i ** 2 for i in xrange(10)) is a generator for the square of the first 10 natural numbers (0 to 9)

    They also allow an "if" clause to filter the itens on the "for" clause, so for your example you can use:

    any (e for e in [1, 2, 'joe'] if isinstance(e, int) and e > 0)
    
    0 讨论(0)
  • 2020-12-13 02:07

    Slight improvement to Antoine P's answer

    >>> any(type(e) is int for e in [1,2,'joe'])
    True
    

    For all()

    >>> all(type(e) is int for e in [1,2,'joe'])
    False
    
    0 讨论(0)
  • 2020-12-13 02:11

    filter can work, plus it returns you the matching elements

    >>> filter(lambda e: isinstance(e, int) and e > 0, [1,2,'joe'])
    [1, 2]
    
    0 讨论(0)
  • 2020-12-13 02:14

    If you really want to inline a lambda in any() you can do this:

    >>> any((lambda: isinstance(e, int))() for e in [1,2,'joe'])
    True
    >>> any((lambda: isinstance(e, int))() for e in ['joe'])
    False
    

    You just have to wrap up the unnamed lambda and ensure it is invoked on each pass by appending the ()

    The advantage here is that you still get to take advantage of short circuiting the evaluation of any when you hit the first int

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