如何检查过滤器 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() 函数是否返回了一个空的可迭代对象。 我想知道列表是否为空,如果是,则做一件事。如果不是,请执行其他操作。

可以通过三种方法解决此问题:

  1. 将过滤器对象转换为列表,然后检查它是否为空:
     l = list(filterObject)
     if (len(l) == 0):
        # The filterObject is empty, do the empty thing 

问题是您必须将 filterObject 可迭代对象转换为列表,如果可迭代对象非常大,这可能是一个非常昂贵的操作。

  1. 使用 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。

  1. 像往常一样遍历 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.

缺点:您需要手动处理整个列表。无法将过滤器对象传递给聚合函数。

我只能想到这些了!