如何检查过滤器 returns 是否在 Python 3 中没有结果?
How do I check if a filter returns no results in Python 3?
我有一个过滤功能,可以用来清除列表中的某些项目:
def filterOutPatternMatches(objList, matchKey, matchPatterns):
def checkPatterns(obj):
delete_it=True
for pat in matchPatterns:
matchString=obj[matchKey]
if pat.search(matchString):
delete_it=False
break
return delete_it
result = filter(checkPatterns, objects);
return result
它工作正常,除了我没有简单的方法来查明 filter() 函数是否返回了一个空的可迭代对象。
我想知道列表是否为空,如果是,则做一件事。如果不是,请执行其他操作。
可以通过三种方法解决此问题:
- 将过滤器对象转换为列表,然后检查它是否为空:
l = list(filterObject)
if (len(l) == 0):
# The filterObject is empty, do the empty thing
问题是您必须将 filterObject 可迭代对象转换为列表,如果可迭代对象非常大,这可能是一个非常昂贵的操作。
- 使用 next() 从可迭代的过滤器对象中拉出第一项。如果列表中没有任何内容,您将收到必须捕获的 StopIteration 错误。
您还需要处理其余项之外的第一项,因为您无法将其放回可迭代对象中。
try:
firstItem = next(filterObject)
# Do whatever you need to do with the first item in the filterObject iterable
except StopIteration:
# Do whatever you do if there are no filter results
for o in filterObject:
# Now handle the rest of the filter results
问题在于:您必须处理 for 循环之外的第一项,这很烦人。如果你想 运行 filterObject 可迭代对象上的一些聚合函数,你必须单独处理你提取的一项。非常不pythonic。
- 像往常一样遍历 filterObject,但如果它为空则设置一个标志:
filterObject = filter(someFunc, someIterable)
itWasEmpty=true
for x in filterObject:
itWasEmpty=false
# Process the filterObject items
if itWasEmpty:
# Do whatever you do if it's empty.
缺点:您需要手动处理整个列表。无法将过滤器对象传递给聚合函数。
我只能想到这些了!
我有一个过滤功能,可以用来清除列表中的某些项目:
def filterOutPatternMatches(objList, matchKey, matchPatterns):
def checkPatterns(obj):
delete_it=True
for pat in matchPatterns:
matchString=obj[matchKey]
if pat.search(matchString):
delete_it=False
break
return delete_it
result = filter(checkPatterns, objects);
return result
它工作正常,除了我没有简单的方法来查明 filter() 函数是否返回了一个空的可迭代对象。 我想知道列表是否为空,如果是,则做一件事。如果不是,请执行其他操作。
可以通过三种方法解决此问题:
- 将过滤器对象转换为列表,然后检查它是否为空:
l = list(filterObject)
if (len(l) == 0):
# The filterObject is empty, do the empty thing
问题是您必须将 filterObject 可迭代对象转换为列表,如果可迭代对象非常大,这可能是一个非常昂贵的操作。
- 使用 next() 从可迭代的过滤器对象中拉出第一项。如果列表中没有任何内容,您将收到必须捕获的 StopIteration 错误。 您还需要处理其余项之外的第一项,因为您无法将其放回可迭代对象中。
try:
firstItem = next(filterObject)
# Do whatever you need to do with the first item in the filterObject iterable
except StopIteration:
# Do whatever you do if there are no filter results
for o in filterObject:
# Now handle the rest of the filter results
问题在于:您必须处理 for 循环之外的第一项,这很烦人。如果你想 运行 filterObject 可迭代对象上的一些聚合函数,你必须单独处理你提取的一项。非常不pythonic。
- 像往常一样遍历 filterObject,但如果它为空则设置一个标志:
filterObject = filter(someFunc, someIterable)
itWasEmpty=true
for x in filterObject:
itWasEmpty=false
# Process the filterObject items
if itWasEmpty:
# Do whatever you do if it's empty.
缺点:您需要手动处理整个列表。无法将过滤器对象传递给聚合函数。
我只能想到这些了!