在Python中获取迭代器中元素的数量

214 投票
20 回答
240730 浏览
提问于 2025-04-16 01:54

有没有一种简单的方法可以知道Python中一个迭代器里有多少个元素,而不需要一个一个地去数?

20 个回答

96

不,任何方法都需要你处理每一个结果。你可以这样做:

iter_length = len(list(iterable))

但是在一个无限的迭代器上运行这个,当然是永远不会返回结果的。而且这样会消耗掉迭代器,如果你想再次使用里面的内容,就需要重置它。

告诉我们你真正想解决的问题,可能会帮助我们找到更好的方法来实现你的目标。

补充一下:使用 list() 会一次性把整个可迭代对象读入内存,这可能不是你想要的。另一种方法是这样做:

sum(1 for _ in iterable)

正如其他人所提到的那样。这样可以避免将其保存在内存中。

320

这段代码应该可以正常工作:

>>> iter = (i for i in range(50))
>>> sum(1 for _ in iter)
50

虽然它会遍历每一个项目并进行计数,但这是最快的方式。

当迭代器没有任何项目时,它也能正常工作:

>>> sum(1 for _ in range(0))
0

当然,对于无限输入,它会一直运行下去,所以要记住,迭代器可以是无限的:

>>> sum(1 for _ in itertools.count())
[nothing happens, forever]

另外,要注意的是使用这个方法会耗尽迭代器,之后再尝试使用它时会看到没有元素。这是Python迭代器设计的一个不可避免的结果。如果你想保留这些元素,就得把它们存储在列表里或者其他地方。

138

不,可以说这是不可能的。

举个例子:

import random

def gen(n):
    for i in xrange(n):
        if random.randint(0, 1) == 0:
            yield i

iterator = gen(10)

在你开始遍历(使用)iterator之前,它的长度是未知的。

撰写回答