Python filter / max combo – 检查空迭代器

(使用Python 3.1)

我知道这个问题多次被问到测试迭代器是否为空的一般问题;很明显,没有那个简洁的解决方案(我猜有一个原因 – 迭代器在它被要求返回其下一个值之前并不真正知道它是否为空).

但是,我有一个具体的例子,希望我能用它制作干净的Pythonic代码:

#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)

有没有更好的方法呢?

编辑:抱歉愚蠢的表示法.函数的参数确实是任意可迭代的,而不是列表.

解决方法:

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

当序列为空时,min抛出ValueError.这遵循了常见的“更容易请求宽恕”范例.

编辑:基于减少的解决方案,无例外

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)
上一篇:filter使用


下一篇:Python小白的零碎记录