一般来说,有没有一种有效的方法可以知道在Python中一个迭代器中有多少元素,而不需要遍历每个元素并进行计数?
发布于 2010-07-28 00:42:54
不是的。这不可能。
示例:
import random
def gen(n):
for i in xrange(n):
if random.randint(0, 1) == 0:
yield i
iterator = gen(10)在遍历iterator之前,它的长度是未知的。
发布于 2010-07-28 00:34:51
不,任何方法都需要你解析每一个结果。你可以做到
iter_length = len(list(iterable))但是在无限迭代器上运行它当然永远不会返回。它还将消耗迭代器,如果您想使用内容,则需要对其进行重置。
告诉我们您试图解决的实际问题可能会帮助我们找到更好的方法来实现您的实际目标。
编辑:使用list()会一次将整个可迭代内容读取到内存中,这可能是不可取的。另一种方法是
sum(1 for _ in iterable)就像另一个人发布的那样。这将避免将其保存在内存中。
发布于 2013-02-27 20:22:39
您不能(除非特定迭代器的类型实现了一些特定的方法,从而使其成为可能)。
通常,您只能通过使用迭代器来计算迭代器项。可能是最有效的方法之一:
import itertools
from collections import deque
def count_iter_items(iterable):
"""
Consume an iterable not reading it into memory; return the number of items.
"""
counter = itertools.count()
deque(itertools.izip(iterable, counter), maxlen=0) # (consume at C speed)
return next(counter)(对于Python3.x,将itertools.izip替换为zip)。
https://stackoverflow.com/questions/3345785
复制相似问题