Python filter/max组合 - 检查空迭代器
(使用 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 的解决方案。