Python filter/max组合 - 检查空迭代器

9 投票
5 回答
14010 浏览
提问于 2025-04-16 05:31

(使用 Python 3.1)

我知道这个问题已经被问过很多次,主要是关于如何检查一个迭代器是否为空;显然,这个问题没有简单的解决办法(我想这是有原因的——因为迭代器在被要求返回下一个值之前,实际上并不知道自己是否为空)。

不过,我有一个具体的例子,希望能用干净且符合 Python 风格的代码来处理它:

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

有没有更好的方法来做到这一点呢?

编辑:抱歉之前的表述不太清楚。这个函数的参数实际上是一个任意的可迭代对象,而不是一个列表。

5 个回答

2
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

列表推导式只允许那些不会被判断为假值的项目(这就排除了0和None)。

一个空列表,比如说[],会被判断为假,所以“如果lst:”这个条件只有在列表里有东西的时候才会成立。

9

在编程中,有时候我们会遇到一些问题,比如代码运行不正常或者出现错误。这些问题可能是因为我们写的代码有bug,或者是因为我们没有正确使用某些功能。

当我们在网上寻找解决方案时,StackOverflow是一个很好的地方。在这里,很多开发者会分享他们的经验和解决方案。如果你在某个问题上卡住了,可以在这个网站上搜索一下,看看别人是怎么解决类似的问题的。

记得在提问的时候,要尽量描述清楚你遇到的问题,包括你写的代码和你希望实现的目标。这样其他人才能更好地帮助你。

总之,遇到问题不要怕,去寻找答案,学习别人的经验,你会慢慢变得更厉害的!

t = [1,2,3]
if any(filter(lambda x: x == 10, t)):
   print("found 10")
9
def f(lst):
  flt = filter(lambda x : x is not None and x != 0, lst)
  try:
    return min(flt)
  except ValueError:
    return None
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)

当序列是空的时,min 会抛出一个 ValueError 错误。这遵循了一个常见的原则,叫做“事后求饶更简单”。

编辑:这里有一个不使用异常的基于 reduce 的解决方案。

撰写回答