Python filter / max combo - checking for empty iterator
Question: (Using Python 3.1)

I know this question has been asked many times for the general question of
testing if iterator is empty; obviously, there's no neat solution to that (I
guess for a reason - an iterator doesn't really know if it's empty until it's
asked to return its next value).

I have a specific example, however, and was hoping I can make clean and
Pythonic code out of it:

    
    
    #lst is an arbitrary iterable
    #f must return the smallest non-zero element, or return None if empty
    def f(lst):
      flt = filter(lambda x : x is not None and x != 0, lst)
      if # somehow check that flt is empty
        return None
      return min(flt)
    

Is there any better way to do that?

EDIT: sorry for the stupid notation. The parameter to the function is indeed
an arbitrary iterable, rather than a list.


Answer: 
    def f(lst):
      flt = filter(lambda x : x is not None and x != 0, lst)
      try:
        return min(flt)
      except ValueError:
        return None
    

`min` throws `ValueError` when the sequence is empty. This follows the common
"Easier to Ask for Forgiveness" paradigm.

EDIT: A reduce-based solution without exceptions

    
    
    from functools import reduce
    def f(lst):
      flt = filter(lambda x : x is not None and x != 0, lst)
      m = next(flt, None)
      if m is None:
        return None
      return reduce(min, flt, m)
    

