我有一个很大的Iterable
。
我想用filter()
函数过滤它。
我如何计算(以某种优雅的方式)有多少项被过滤?
(same问题可以针对map()
、reduce()
等)
我肯定我能做到:
items = get_big_iterable()
count_good = 0
count_all = 0
for item in items:
if should_keep(item):
count_good += 1
count_all += 1
print('keep: {} of {}'.format(count_good, count_all))
filter()
有可能实现吗?
items = filter(should_keep, get_big_iterable())
for item in items:
#... using values here ..
#possible count not filtered items here too?
我不应该重复两次,并且希望使用filter()
或类似的解决方案
3条答案
按热度按时间e5njpo681#
使用
enumerate
和一些基本的算术应该非常简单:输出:
不过我可能不会使用它。注意,我假设您可能不想修改
should_keep
,但您总是可以将其 Package 。8ftvxx2r2#
我能想到两种方法:第一个比较短,但可能对性能不好,而且无法达到使用迭代器的目的:
另一种方法是编写自己的过滤器,根据Python文档:
请注意,如果函数不是None,则
filter(function, iterable)
等效于生成器表达式(item for item in iterable if function(item))
;如果函数不是None,则filter(function, iterable)
等效于生成器表达式(item for item in iterable if item)
。所以你可以这样写:
然后,您可以从
Filter
示例访问count_good
和count_all
:ztmd8pv53#
内置的
filter
没有提供这个功能,您需要编写自己的filter类,实现它的__next__
和__iter__
方法。代码
示例
输出