【问题标题】:Find the length of a filter object in python 3在python 3中查找过滤器对象的长度
【发布时间】:2014-06-18 17:23:41
【问题描述】:

如何在 python 3 中找到过滤器对象的长度?

def is_valid_file(filename):
  return True

full_path_fnames = filter(is_valid_file, full_path_fnames)

print(len(full_path_fnames))

【问题讨论】:

    标签: python python-3.x


    【解决方案1】:

    只有在完成对它的迭代后,你才能说出它有多少元素。内置len 函数调用对象的__len__ method,如您所见,filter 对象没有该方法

    >>> '__len__' in dir(filter(bool, [0, 1, 2]))
    False
    

    因为它们基本上是迭代器。

    找到长度的一种可能方法是

    >>> sum(1 for _ in filter(bool, [0, 1, 2]))
    2
    

    还有一种是转换成list类型,当然是有长度的:

    >>> len(list(filter(bool, [0, 1, 2])))
    2
    

    请注意,所有解决方案都会耗尽迭代器,因此您将无法重用它:

    >>> f = filter(bool, [0, 1, 2])
    >>> list(f) 
    [1, 2]
    >>> list(f) 
    []
    

    【讨论】:

    • sum(1 for _ in filter(func, iterable)) 是如果您无法将整个迭代放入内存中的首选方式。
    【解决方案2】:

    在 Python2.x 中,filter 返回 list,但在 Python3 中,它为您提供了一个迭代器,您可以将其转换为 list,然后检查长度:

    len(list(filter(foo, bar)))
    

    演示:

    >>> filter(lambda x: x < 3, [1,2,3])
    <filter object at 0x7fdf9ea1af90>
    >>> list(filter(lambda x: x < 3, [1,2,3]))
    [1, 2]
    >>> len(list(filter(lambda x: x < 3, [1,2,3])))
    2
    

    【讨论】:

      猜你喜欢
      • 2013-10-11
      • 2017-06-11
      • 2017-08-09
      • 1970-01-01
      • 2017-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-04
      相关资源
      最近更新 更多