统计可迭代对象中元素的数量

5

如何通过迭代的方式计算可迭代对象中元素的数量,而不需要将元素存储在内存中?

目前,我只是使用sum(1 for x in iterable)来实现。我希望能够在itertools中找到一些相关的方法,但似乎没有。


1
顺便提一下,这个功能已经在多年前被请求过了:https://mail.python.org/pipermail/python-list/2003-August/182237.html,但不幸的是,讨论就此停止了。我认为这个问题经常出现,应该被添加到Python中。 - simonzack
2个回答

5
sum(1 for x in iterable) 是最佳方法。并非所有情况都需要专门的 itertools 函数。 :-) 我注意到你声称不是重复问题的答案在此帖子中也建议您使用此方法。
当然,总是值得查看 itertools,以防万一,如果您这样做,请不要忘记检查 配方部分;您会发现 quantify() 配方几乎可以完成相同的工作,但具有过滤可迭代对象的谓词功能:
def quantify(iterable, pred=bool):
    "Count how many times the predicate is true"
    return sum(imap(pred, iterable))

1

我认为这个功能应该包含在itertools中,但事实上并没有。

more-itertools是一个包,其中包括ilen,但可能对您的情况来说有点过重。当我遇到这种情况时,我只需定义常用的解决方法作为ilen

def ilen(iterable):
    return sum(1 for _ in iterable)

1
我认为将itertools提供的基本构建块并将如此简单的一行代码封装成函数并没有太大的价值。因为more-itertools中的ilen()函数恰好可以执行您在此处回答中包含的操作。 - Martijn Pieters
@MartijnPieters 如果使用频率足够高,它可能会很有用,因为 sum 的解决方法对我来说并不那么干净。 - simonzack
more-itertools 似乎包含了很多有用的方法,我希望我早点知道它! - loopbackbee
@simonzack жіЁж„ҸпјҢеҪ“дҪ дҪҝз”Ёilenж—¶пјҢдҪ жӯЈеңЁдҪҝз”Ёsumзҡ„еҸҳйҖҡж–№жі•пјҢиҝҷжҳҜMartijn PietersжүҖжҢҮзҡ„пјҢжҲ‘жғігҖӮиҷҪ然еҰӮжӯӨпјҢilenеҸҜд»Ҙжӣҙжё…жҘҡең°иЎЁиҫҫдҪ зҡ„ж„ҸеӣҫгҖӮ - loopbackbee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接