Python filter / max combo - checking for empty iterator

后端 未结 4 1127
有刺的猬
有刺的猬 2021-01-12 08:44

(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 t

相关标签:
4条回答
  • 2021-01-12 09:09

    If you just want to check if the return of filter is empty, you might do (Python3)

    len(list(filter(lambda e : e == 2, [1,2,3])))

    But notice, hence filter is a generator if you this test twice, second time, you will receive a diferent result:

    len(list(filter(lambda e : e == 2, [1,2,3]))) len(list(filter(lambda e : e == 2, [1,2,3])))

    >>> 1

    >>> 1

    But:

    f = filter(lambda e : e == 2, [1,2,3]) len(list(f)) len(list(f))

    >>> 1

    >>> 0

    0 讨论(0)
  • 2021-01-12 09:18

    you can go for reduce expression too return reduce(lambda a,b: a<b and a or b,x) or None

    0 讨论(0)
  • 2021-01-12 09:19
    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)
    
    0 讨论(0)
  • 2021-01-12 09:31
    def f(lst):
        # if you want the exact same filtering as the original, you could use
        # lst = [item for item in lst if (item is not None and item != 0)]
    
        lst = [item for item in lst if item]
        if lst: return min(lst)
        else: return None
    

    the list comprehension only allows items that don't evaluate to boolean false (which filters out 0 and None)

    an empty list i.e. [] will evaluate to False, so "if lst:" will only trigger if the list has items

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